为什么scanf不允许再输入?

时间:2017-01-29 12:46:17

标签: 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并且效果很好。 但是,在这种情况下,只要在输入一个字符串后点击return / enter,输出就是not a substring

我做错了什么?

2 个答案:

答案 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;
}