Почему контроль идет внутри IF? - PullRequest
1 голос
/ 02 октября 2009
          char *token = "gkjsdhvcxvcvbcbcv"            
          char c[90];  
          strcpy( c, token);
          c[sizeof(c)-1] = '\0';
          char *broken = strtok(c, " ");                 
          if ( broken != NULL)
          {  
            //Should not come here as there is no white space???
           }

Ответы [ 5 ]

14 голосов
/ 02 октября 2009

Вы получаете первый токен, который является всей строкой. Второй вызов вернет NULL, так как токенов больше нет:

char *token = "gkjsdhvcxvcvbcbcv"            
char c[90];  
strcpy( c, token);
c[sizeof(c)-1] = '\0';
char *broken = strtok(c, " ");                 
if ( broken != NULL) {  
    // Will come in here, broken == c.
}
broken = strtok(NULL, " ");                 
if ( broken != NULL) {  
    // Won't come in here.
}
3 голосов
/ 02 октября 2009

Вы пытаетесь определить, есть ли в строке пробелы?

Если это так, то решение состоит в том, чтобы использовать strchr () вместо strtok (). например,

if (strchr(c, ' ') == NULL) {
    // string has no spaces
} else {
    // string has at least one space
}

Если вы хотите токенизировать строку только в том случае, если строка содержит хотя бы один разделитель, вам необходимо использовать обе функции strchr () и strtok ():

char *broken = NULL;
if (strchr(c, ' ') != NULL)
    broken = strtok(c, " ");
3 голосов
/ 02 октября 2009

strtok делит входную строку на меньшие строки, разделенные входными разделителями. Поскольку пробела нет, он возвращает всю строку.

3 голосов
/ 02 октября 2009

Сама строка при отсутствии разделителей является первым токеном.

Если вы попытаетесь напечатать broken, я думаю, вы увидите, что это так.

Если вы хотите, чтобы часть кода не выполнялась, если в строке отсутствует определенный символ, вам следует проверить с помощью strstr или strchr.

0 голосов
/ 02 октября 2009

Что может пойти не так с кодом выше:

  • не использует, по крайней мере, strncpy спрашивает для проблем, в конечном итоге
  • Что такое sizeof (c) возвращается? Я забыл на момент, но мои догадки либо 1, или 90. (возможно 90)

И как уже отмечали другие, strtok (), кажется, ведет себя правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...