#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/