#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
并且效果很好。
但是,在这种情况下,只要在输入一个字符串后点击return / enter,输出就是not a substring
。
我做错了什么?
答案 0 :(得分:13)
scanf()
的第一次调用在看到换行符('\n'
)时停止,但它仍然在输入流中。
因此,第二次调用会立即失败,因为它会看到(相同的)换行符。
您应该始终检查scanf()
来电失败的返回值。
您可以在getchar();
次来电之间插入scanf()
来电,以使用换行符。或者更好地使用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;
}
答案 1 :(得分:3)
您使用的scanf()
格式%[^\n]
没有尾随s
,您应该提供要存储到目标数组中的最大字符数。由于数组的大小为100,因此您应指定%99[^\n]
。
此外,您必须跳过2 %99[^\n]
之间的换行符,否则第二次转换将失败,因为没有与\n
不同的字符匹配。
以下是使用scanf()
的简单修正。 usr 使用fgets()
有一个很好的选择,这是一种解析输入的简单方法:
#include <stdio.h>
#include <string.h>
int main(void) {
char a[100], b[100], c;
if (scanf("%99[^\n]%c%99[^\n]", a, &c, b) == 3 && c == '\n') {
if (strstr(a, b))
printf("its a substring\n");
else
printf("not a substring\n");
}
return 0;
}