您的代码中有几个问题,但我看不出有任何fgets() 跳过或跳过的原因。 getchar() 函数从stdin 中读取下一个字符。一般我们在给getchar()函数输入时,输入字符后按ENTER键。这在输入流中留下了\n 字符,可以被下一个调用的输入函数使用。但是在您的情况下,您没有在 getchar() 之后调用任何其他输入函数。
[尝试在 fgets() 上方调用 getchar() 并输入为 - 输入字符后跟 ENTER 键。您将看到 fgets() 被跳过,因为它消耗了输入流 stdin 中剩余的 \n 字符。]
问题 1:
看看这句话:
str[j] = str + 1;
由于str 是一个char 数组,str[j] 表示位置j 的字符,str + 1 是指针。因此,此分配不兼容,因为您试图将 char * 类型分配给 char。应该是:
str[j] = str[j + 1];
问题 2:
您的代码存在逻辑问题。它无法处理要删除的字符在输入字符串中连续出现的场景。测试您的代码输入,例如“Hello World”[字符 l 连续出现]。您的程序输出将是[修复问题 1 后]:
Enter a sentence:
Hello World
This is the sentence: Hello World
Enter character to remove:
l
Sentence after removal: Helo Word <==== character l not removed
您的程序无法处理这种特殊情况,因为一旦删除了一个字符,在下一次迭代中它就会从下一个字符开始。
问题 3:
strlen() 返回类型是 size_t 并且您正在使用 char 类型来接收它的返回值。相反,您应该使用 size_t 类型。
getchar() 返回类型是int [因为它在到达输入流末尾时返回特殊值EOF]。您正在使用char 类型变量接收getchar() 返回值。
还有一点(这不是问题,但您应该意识到并采取预防措施):
来自fgets()[强调我的]:
从给定的文件流中最多读取 count - 1 个字符并将它们存储在 str 指向的字符数组中。 如果出现文件结尾或找到换行符,则停止解析,在这种情况下,str 将包含该换行符。 如果没有发生错误,则在最后一个字符之后的位置写入一个空字符写到str。
因此,您传递给fgets() 的输入缓冲区可能包含换行符('\n')。例如,如果您输入 Hello World 后跟 ENTER 键,则输入缓冲区 str 将在其中包含 "Hello World\n"。在您的情况下,这不会导致任何问题,但很少会导致额外的循环迭代。您可以像这样从str 缓冲区中删除\n:
fgets(str, 100, stdin);
str[strcspn(str, "\n")] = 0; // This will remove the trailing newline character from input buffer
另外,您应该检查fgets() 返回。如果失败,fgets() 返回NULL。
把这些放在一起,你可以这样做:
#include <stdio.h>
#include <string.h>
int main() {
char str[100];
size_t i, j, len;
int r;
printf("Enter a sentence: \n");
if (fgets(str, 100, stdin) == NULL) {
fprintf (stderr, ("fgets failed"));
return -1;
}
str[strcspn(str, "\n")] = 0;
printf("This is the sentence: %s\n", str);
printf("Enter character to remove: \n");
r = getchar();
/*If getchar returns EOF, no need to go through character removal logic*/
if (r != EOF) {
len = strlen(str);
i = 0;
while (str[i] != '\0') {
if (str[i] == (char)r) {
for (j = i; j < len; j++) {
str[j] = str[j+1];
}
len--;
}
else
i++;
}
}
printf("Sentence after removal: %s\n", str);
return 0;
}
输出:
# ./a.out
Enter a sentence:
Hello World
This is the sentence: Hello World
Enter character to remove:
l
Sentence after removal: Heo Word
# ./a.out
Enter a sentence:
zzzzz
This is the sentence: zzzzz
Enter character to remove:
z
Sentence after removal:
# ./a.out
Enter a sentence:
aazz
This is the sentence: aazz
Enter character to remove:
a
Sentence after removal: zz