Разница между использованием strtok () для вставленной строки или объявленной строки - PullRequest
0 голосов
/ 07 июня 2018

Чтобы понять поведение strtok() в C ANSI, я использую два кода.

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

int main()
{
    char str[101] = "This is";
    char *pch;
    printf("Splitting string %s into tokens : \n",str);
    pch = strtok(str," ");`enter code here`
    while(pch != NULL)
    {
        printf("%s\n",pch);
        pch = strtok(NULL, " ");
    }
    return 0;
}

Результат этой программы

Splitting string "This is " into tokens:
This
is

Далее я изменил еенемного.

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

int main()
{
    char str[101] = ;
    char *pch;
    scanf("%s",str); //After launch program, I typed "This is "
    str[strcspn(str,"\n")] = '\0'
    printf("Splitting string %s into tokens : \n",str);
    pch = strtok(str," ");`enter code here`
    while(pch != NULL)
    {
        printf("%s\n",pch);
        pch = strtok(NULL, " ");
    }
    return 0;
}

Он печатает

Splitting string "This" into tokens:
This

Я не могу понять, почему пропало второе слово, когда я использую stdin.

1 Ответ

0 голосов
/ 07 июня 2018

Проблема не в strtok, а в использовании scanf и спецификатора формата "%s".Этот спецификатор формата читает строки, разделенные пробелом , т.е. вы не можете использовать "%s" для чтения чего-либо с пробелом в нем.

Естественным решением является использование fgets вместо этого, к которому вы уже подготовились «удалением новой строки» (которую scanf обычно не читал бы в любом случае).

Должно было быть совершенно очевидно, что strtok не может быть вовлечен, поскольку вы печатаете строку ввода до , даже вызывая strtok.

...