c - 为什么 scanf 不允许更多输入?

标签 c scanf

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

int main() {
    char a[100], b[100];
    char *ret;
    scanf("%[^\n]s", a);
    scanf("%[^\n]s", b);
    ret = strstr(a, b);
    if (ret != NULL)
        printf("its a substring");
    else
        printf("not a substring");
    return 0;
}

我的目的是检查字符串中的父字符串中是否存在子字符串。我从 here 了解到 strstr() 函数.

我以前在我的代码中使用过 %[^\n]s 并且它们运行良好。 但是,在这种情况下,只要我在输入一个字符串后按下回车/回车,输出就不是不是子字符串

我做错了什么?

最佳答案

scanf() 的第一次调用在遇到换行符 ('\n') 时停止,但它仍在输入流中。 因此,第二次调用在看到(相同的)换行符时立即失败。

您应该始终检查 scanf() 调用的返回值是否失败。

您可以在 scanf() 调用之间插入 getchar(); 调用以使用换行符。或者更好地使用 fgets()并处理换行符。


这是在代码中使用 fgets() 的方法:

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

int main(void) {
     char a[100], b[100];
     char *ret;
     if (fgets(a, sizeof a, stdin) == NULL) {
        /* error handling */
     }

     a[strcspn(a, "\n")] = '\0';
     if (fgets(b, sizeof b, stdin) == NULL) {
       /* error handling */
     }

     b[strcspn(b, "\n")] = '\0';
     ret=strstr(a, b);
     if(ret!=NULL)
         printf("its a substring");
     else
         printf("not a substring");
     return 0; 
}

关于c - 为什么 scanf 不允许更多输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41921041/

相关文章:

c - 生成二进制序列

c - 循环无法停止

c - 如果语句不起作用?

c - 在 C 中使用 scanf 进行模式匹配

C - 我的 scanf 永远不会停止接受输入

c++ - Win API 中的内存 DC 有多便宜/多贵?

c - 尝试为 lex 程序创建 makefile

c - 优先规则==超过=

c - 如何在 'while' 循环中重新输入整数值?

c - 读取数据文件中的特定列