【问题标题】:Using strstr to determine if a given string contains a string with spaces [C]使用 strstr 确定给定字符串是否包含带空格的字符串 [C]
【发布时间】:2015-01-09 23:00:22
【问题描述】:

我正在研究一个使用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);
}

【问题讨论】:

  • %s 只读一个字。
  • 如果你想读一整行,使用fgets(),而不是scanf()
  • 你把你对strstr的论据交换了。
  • @Barmar:不完全是,不是。虽然那是一部分。

标签: c string contains strstr


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

【讨论】:

    【解决方案2】:

    来自scanf 的手册页:

    “s”——匹配一系列非空白字符;下一个 指针必须是指向足够长的字符数组的指针 保存输入序列和终止空字节('\0'), 这是自动添加的。 输入字符串停在白色 空格或最大字段宽度,以先到者为准。

    因此,“Sue Smith”部分永远不会出现在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 的“干草堆”参数首先出现。)

    【讨论】:

      猜你喜欢
      • 2011-02-24
      • 1970-01-01
      • 2012-05-18
      • 2014-01-29
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      相关资源
      最近更新 更多