2014-11-12 5 views
0

Я работаю над использованием функции strstr().Использование strstr для определения того, содержит ли данная строка строку с пробелами [C]

Если я ввожу «Памела Сью Смит», почему выход программы «Памела» является подстрокой! » а не «Памела Сью Смит» - это подстрока! ».

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

void main(void) 
{ 
    char str[72]; 
    char target[] = "Pamela Sue Smith"; 

    printf("Enter your string: "); 
    scanf("%s", str); 

    if (strstr(target, str) != NULL) 
    printf(" %s is a sub-string!\n", str); 
} 
+3

'% s' только одно слово. – Barmar

+3

Если вы хотите прочитать целую строку, используйте 'fgets()', а не 'scanf()'. – Barmar

+2

И вы передали свои аргументы 'strstr'. – Deduplicator

ответ

3
  1. main не имеет возвращаемого типа void но int.
  2. scanf может потерпеть неудачу. Проверьте возвращаемое значение.
    В случае успеха он возвращает количество назначенных параметров.
  3. %s только читает пробелы без пробелов, до следующего пробела (таким образом, 1 слово).
  4. %s не ограничивает количество прочитанных пробелов. Переполнение буфера может быть смертельным.
    Использование %71s (размер буфера: длина строки + 1 для терминатора)
  5. Вы поменяли аргументы на strstr.
3

От страницы руководства scanf:

«s» - Соответствует последовательность без пробельных символов; следующий указатель должен быть указателем на массив символов, который достаточно длинный для хранения входной последовательности и завершающего нулевого байта ('\ 0'), , который добавляется автоматически. Входная строка останавливается на белом пространстве или при максимальной ширине поля, в зависимости от того, что произойдет раньше.

Итак, часть «Сью Смит» никогда не делает это str. Вы можете использовать fgets, который позволяет читать всю строку в то время:

if (fgets(str, sizeof str, stdin) == NULL) { 
    printf("End of file\n"); 
    return; 
} 

Обратите внимание, что в этом случае str содержит завершающего конца-строки символов. Вы можете сделать

if (*str != '\0') 
    str[strlen(str) - 1] = '\0'; 

, чтобы удалить его. (Кроме того, как уже указывали некоторые другие, аргумент «haystack» равен strstr).

+0

+1 за хороший ответ и «стог сена». – chux