Проблема чтения строки при использовании scanf - PullRequest
1 голос
/ 13 апреля 2011

Теперь я читаю кое-что:

Функция scanf ()% [\ n] будет соответствовать символу новой строки, а% [^ \ n] будет соответствовать всем символам до новой строки.1004 *

Но в следующем коде:

#include<stdio.h>


int main() {
printf("Enter Something: ");
char name[100];   
scanf("%99[help]", name);
printf("%s",name);
}

У меня нет проблем, когда я ввожу help me, поскольку напечатанное слово - help.Однако, когда я ввожу I need help, он печатает мусор.Пожалуйста, помогите, как решить эту проблему?Моя цель состоит в том, чтобы соответствовать слову help, введенному в любом месте на входе, например,

"This is a test, i need help in this"

Должно обнаружить help.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011

Вам необходимо проверить результат scanf. Если он не совпадает, указатель, который вы передаете, не изменяется. В вашем конкретном случае name будет содержать произвольные данные.

Как только вы проверите вывод scanf, вы увидите, что он не соответствует этой строке. scanf не является анализатором регулярных выражений. Он будет пытаться сопоставить только первый «элемент», который видит во входном потоке.

Спецификатор совпадения %99[help] означает «я хочу сопоставить все, что содержит буквы h, e, l, p в любом порядке , длиной до 99 символов». Это все. Таким образом, он не работает с самой первой буквой вашего ввода («T»), которой нет в наборе.

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

1 голос
/ 13 апреля 2011

Вам нужен набор сканеров, чтобы распознавать все символы, которые вы можете ввести.Вам также нужно проверить возврат от scanf(), чтобы увидеть, удалось ли это.

#include <stdio.h>

int main()
{
    printf("Enter Something: ");
    char name[100];   
    if (scanf("%99[Indhelp ]", name) != 1)
        fprintf(stderr, "scanf() failed\n");
    else
        printf("%s",name);
    return 0;
}

Это распознает «Мне нужна помощь» и многие другие фразы.Стандарт C гласит:

Если - символ находится в списке сканирования и не является ни первым, ни вторым, где первый символ является ^, ни последним символом, поведение определяется реализацией.

Во многих реализациях вы можете использовать нотацию, такую ​​как %[a-zA-Z ], чтобы подобрать строку букв или пробелов.Однако это поведение, определяемое реализацией.Это означает, что она может делать все, что выберет реализация, но реализация должна документировать, что она означает.

Надежный способ написания набора сканирования:

%[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ]

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

...