Онлайн компилятор C

#include <stdio.h> #include <string.h> int length(char s[]) { int i = 0; while (s[i] != '\0') { i++; } return i; } int result(char a[], char b[]) { int size_a = length(a); int size_b = length(b); int counter = 0; if (size_a >= size_b) { for (int i = 0; i < size_a - size_b + 1; i++) { int sum = 0; for (int j = 0; j < size_b; j++) { if (a[i + j] == b[j]) { sum++; } } if (sum == size_b) { counter++; } } } return counter; } void remove_newline(char s[]) { int i = 0; int size = length(s); while (i < size) { if (s[i] == '\n') { s[i] = '\0'; return; } i++; } } int main() { char a[1001]; char b[101]; while(getchar()!='\n'); fgets(a, 1001, stdin); fgets(b, 101, stdin); remove_newline(a); remove_newline(b); printf("%s\n", a); printf("%s\n", b); printf("%d", result(a, b)); return 0; }
这段代码的功能是:从标准输入读取两行字符串,然后统计字符串b在字符串a中出现的次数(不重叠),并输出结果。代码中包含了自定义的字符串长度函数和去除换行符的函数。

代码中存在一个逻辑问题:在读取输入之前,使用了一个while循环来消耗输入流中的字符,这可能会导致第一个字符串被意外跳过或读取不完整。

- 检查 while(getchar()!='\n'); 这一行。这个循环会不断读取字符直到遇到换行符,但此时输入流中可能还没有任何内容,或者它会消耗掉你期望被fgets读取的第一个字符串的一部分。考虑这个循环是否必要,以及它实际消耗了哪些输入。
- 注意fgets会读取换行符并存入字符串中,而remove_newline函数会将其替换为'\0'。但你的代码在调用fgets后立即调用了remove_newline,这是正确的。不过,如果输入的第一行恰好是空行,while循环的行为可能会不符合预期。