使用strstr确定给定的字符串是否包含带空格的字符串[C]

时间:2014-11-12 22:38:40

标签: c string contains strstr

我正在使用strstr()函数的示例。

如果我输入" Pamela Sue Smith",为什么节目输出"" Pamela"是一个子串!"而不是"" Pamela Sue Smith"是一个子串!"。

#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);
}

2 个答案:

答案 0 :(得分:3)

  1. main没有返回类型void,但int
  2. scanf可能会失败。检查返回值 如果成功,则返回分配的参数数量。
  3. %s只读取非空格,直到下一个空格(即1个单词)。
  4. %s不限制读取的非空白字符数。缓冲区溢出可能是致命的 使用%71s(缓冲区大小:字符串长度+ 1作为终结符)
  5. 您将参数换成strstr

答案 1 :(得分: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';

删除它。 (另外,正如其他一些人已经指出的那样,strstr的“干草堆”论点是第一位的。)