2015-05-02 6 views
2

Я использую strtok для разделения строки, он работает как и ожидалось для первых 4 итераций, но после этого начинает испортиться. Предполагается, что программа возьмет такую ​​строку, как «david 1 2 3 4 5», и распечатайте имя плюс сумму чисел «david 15» ... Однако у меня проблема с strtok.strtok работает не так, как ожидалось, работает только для первых нескольких итераций

EDIT: Я делаю номер указатель для последующего использования кода (это только фрагмент)

Это мой C сценарий:

#include <stdio.h> 
#include <string.h> 

char str1[50]; 
char *token; 
char *end; 
long int *number; 
int loop = 1; 
while(loop){ 
    fgets(str1,50,stdin); 
    token = strtok(str1," "); 
    printf("%s ",token); 
    *number = 0; 
    while(token != NULL){ 
     token = strtok(NULL," "); 
     if(token != NULL){ 
      *number = *number + strtol(token,&end,0); 
     } 
    } 
    printf("%li\n",*number); 
} 

С этим входом:

David 10 10 10 10 10 

Я получаю этот выход:

David 40 

Ожидаемый результат:

David 50 

Подозревая strtok, я эти заявления тест печати:

char str1[50]; 
char *token; 
char *end; 
long int *number; 
int loop = 1; 
while(loop){ 
    fgets(str1,50,stdin); 
    token = strtok(str1," "); 
    printf("%s\n",token); 
    *number = 0; 
    while(token != NULL){ 
     printf("before new token: %s\n",token); // <---HERE 
     token = strtok(NULL," "); 
     printf("after new token: %s\n\n",token); // <---HERE 
     if(token != NULL){ 
      *number = *number + strtol(token,&end,0); 
     } 
    } 
    printf("%li\n",*number); 
} 

И с тем же входом:

David 10 20 30 40 50 

я получаю:

David 
before new token: David 
after new token: 10 

before new token: 10 
after new token: 20 

before new token: 20 
after new token: 30 

before new token: 30 
after new token: 4< 

before new token: [email protected] 
after new token: (null) 

64 

Как вы видите, он работает отлично во время первых нескольких итераций, но после этого все начинает плохо. Если кто-нибудь знает, что происходит, я бы очень признателен за совет :) спасибо!

+0

Просто для удовольствия, что произойдет, если добавить пробел после '40'? –

+0

уже есть пробел после 40. Вход - это Давид 10 20 30 40 50 – Vaderico

+0

'number' не указывает на что-либо определенное ... –

ответ

1

Причина вы получите 40 вместо 50 является то, что вы уронили первый маркер (то есть тот, который вы получаете от strtok, когда вы проходите str1, не NULL). Вы должны добавить его к сумме перед входом в цикл, или реорганизовать цикл, чтобы добавить первый и вызовите strtok следующий:

number = 0; // There is no point in making "number" a pointer 
token = strtok(str1," "); 
while(token != NULL){ 
    printf("%s ",token); 
    number += strtol(token,&end,0); 
    token = strtok(NULL," "); 
} 

Demo.

+0

Я программирую на C, кстати. hmm не работает, я помещаю печать до строки strtok во время цикла, делает то же самое – Vaderico

+0

@Vaderico Прекрасно работает для меня. См. Демонстрационную ссылку, которую я добавил в нижней части ответа. – dasblinkenlight

+0

Ahh okay просто проверил, и он отлично работает. Спасибо огромное! upvoted – Vaderico

4

Переменная number является указателем (почему?), Но вы никогда не заставляете его указывать в любом месте, поэтому, когда вы разыщите его, у вас будет undefined behavior.

Простое решение? Не сделайте это указателем!

+0

, пожалуйста, обратитесь к моему правлению. Мне нужно, чтобы он был указателем для последующего использования, это всего лишь фрагмент. – Vaderico

+1

@Vaderico Вам все равно нужно что-то указать. Кроме того, вы, скорее всего, не нуждаетесь в нем в качестве указателя, поскольку вы можете использовать, например.'& number', чтобы сделать указатель вне переменной-указателя. –