2016-06-03 8 views
-2

Я задавался вопросом, как я могу скопировать часть строки в другую, так что я проверил эту сеть, чтобы увидеть, если я мог бы получить ответ, и я сделал: How can I copy part of another string in C, given a starting and ending indexНе удается скопировать часть строки

Однако, когда я использую этот

strncpy(dest, src + beginIndex, endIndex - beginIndex); 

на мой код, он не работает. Зачем? Я думаю, что я добавил индексы правильно.

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <math.h> 
#define MAX 15 

int main() 
{ 
    int j=0; 
    int i; 
    char RPNarray[MAX]; 
    printf("Enter the RPN"); 
    fgets(RPNarray,MAX,stdin); 
    int t=strlen(RPNarray); 
    double RPN[t][2]; 

    for(i=0;i<=t;i++) 
    { 
     if(isspace(RPNarray[i])) 
     { 
      i=i+1; 
     } 
     else if (isdigit(RPNarray[i])) 
     { 
      int q,h; 
      q=i; 
      for (h=i;isdigit(RPNarray[h]);h++) 
      { 
       h=h+1; 
      } 
      int r; 
      double u; 
      r=h-q; 
      char number[r]; 
      printf("%s ", RPNarray); 
      strncpy(number,RPNarray + q,h - q); 
      printf ("%s\n",number); 
      u=atof(number); 
      printf("%lf.\n",u); 
      RPN[j][0]=0; 
      RPN[j][1]=u; 
      i=i+1; 
      j=j+1; 
     } 
    } 
    int b; 
    for (b=0;b<=j;b++) 
    { 
     printf("%lf %lf \n",RPN[b][0],RPN[b][1]); 
    } 
} 

r это количество цифр номера, q позиции первой цифрой числа и ч первое положение после того, как число, которое не является числом.

Эта программа должна печатать матрицу RPN, как сказано в коде.

(0,(first number we introduce via stdin) 
(0,(second number we introduce via stdin) 
(0,(third number we introduce via stdin) 

Я также добавил больше отпечатков, чтобы увидеть, где находится проблема, и как вы можете видеть, второй печать не выводится на печать, как это должно быть.

Если вход:

56 6 
The output is: 
56 6 
56OT? 
56.000000. 
vector 0.000000 56.000000 
vector 0.000000 0.000000 

Что я могу сделать вывод:

56 6 
56 
56.000000. 
56 6 
6 
6.000000. 
vector 0.000000 56.000000 
vector 0.000000 6.000000 

Спасибо

+2

Пожалуйста, отредактируйте ваше сообщение и исправьте отступ. – Lundin

+0

Узнайте, как использовать отладчик, и пройдите через код, построчно. –

+0

Условия окончания цикла '<=' являются подозрительными. В первом случае 't' проходит мимо длины строки. Во втором «b» индексирует элемент «RPN [b]», который не был установлен при текущем значении 'j', который был увеличен после его использования. –

ответ

0

Может быть, вы просто необходимо continue вместо приращением?

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <math.h> 

#define MAX 15 

int main() { 

    int j = 0; 
    int i; 
    char RPNarray[MAX]; 
    printf("Enter the RPN"); 
    fgets(RPNarray, MAX, stdin); 
    int t = strlen(RPNarray); 
    double RPN[t][2]; 

    for (i = 0; i <= t; i++) { 
     if (isspace(RPNarray[i])) { 
      continue;//i = i + 1; 
     } 
     else if (isdigit(RPNarray[i])) { 
      int q, h; 
      q = i; 
      for (h = i; isdigit(RPNarray[h]); h++) { 
       h = h + 1; 
      } 
      int r; 
      double u; 
      r = h - q; 
      char number[r]; 
      printf("%s ", RPNarray); 
      strncpy(number, RPNarray + q, h - q); 
      printf("%s\n", number); 
      u = atof(number); 
      printf("%lf.\n", u); 
      RPN[j][0] = 0; 
      RPN[j][1] = u; 
      i = i + 1; 
      j = j + 1; 
     } 
    } 
    int b; 
    for (b = 0; b <= j; b++) { 
     printf("%lf %lf \n", RPN[b][0], RPN[b][1]); 
    } 
} 

Тест

Debug/gnu 
Enter the RPN56 6 
56 6 
56 
56.000000. 
56 6 
6 

6.000000. 
0.000000 56.000000 
0.000000 6.000000 
0.000000 0.000000 

Похоже, выход вы хотите. Все, что я сделал, это изменить одно заявление.