c - fgets 没有输入两个字符串
问题描述
我解决了这个问题,但仍有疑问这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argv, char *argc[])
{
if (argv != 2)
{
printf("Invalid Input, Please enter the length of the strings you wish to compare\n");
return 1;
}
int n = atoi(argc[1]);
char *a = malloc((sizeof(char) * n));
printf("Enter the first string - ");
fgets(a, n + 1, stdin);
getc(stdin);
char *b = malloc((sizeof(char) * n) + 1);
printf("Enter second string - ");
fgets(b, n + 1, stdin);
int d = 0;
for (int i = 0; i < n; i++)
{
if (*(a + i) != *(b + i))
{
d++;
}
}
if (d == 0)
{
printf("The two strings are identical\n");
}
else
{
printf("The two strings are not identical\n");
}
free(a);
free(b);
}
添加后我的问题得到了解决getc(stdin);
但是有人可以告诉我它到底在做什么吗?我不知道为什么它有效!
解决方案
fgets
一旦看到换行符,输入后停止读取(如果缓冲区没有足够的空间,则不会消耗)。所以第一个输入的换行符留在输入流中,第二次调用 fgets 看到并停止读取输入。
当您添加getc(stdin);
时,它会消耗剩余的换行符,因此它可以工作。
如评论中所述,您仅分配n
字节,a
但尝试读取最多n + 1
字节。这是未定义的行为。因此,您需要在 malloc 调用中添加“+ 1”(就像您为 分配所做的那样b
)。
您需要注意的另一个问题是,如果换行符有足够的空间(例如,您只输入“hi”并且是 10),也会将换行符fgets
读入。a
b
n
另一个问题是,如果给定的输入小于n
,则循环仍会比较n
字符。这可能是未定义的,因为其余缓冲区未初始化。
break
当出现不匹配时,您也可以立即退出循环。无需比较其余的字符。
推荐阅读
- python - 有没有办法让 while true 语句运行,但让后面的代码也运行?
- kubernetes - 授予 Kubernetes 服务帐户权限以从所有命名空间获取 pod
- react-native - 当我在 react-native highcharts 的图表区域外单击时,工具提示没有关闭
- javascript - 反应 | 如何从状态更新中删除 prevent.default
- algorithm - 保存数据以供以后使用 mips 程序集的方法
- css - 我应该如何在 sass/css 中编写一个选择器来申请类,而不是在整个路径中有另一个类?
- python - 更改 pyplot 子图中的直方图
- java - 如何在用户按下 imageButton 之间添加延迟?
- tfs - 如何使用户能够在本地编辑 TFS 2015 中的 HtmlFieldControl 源?
- php - 如何总结国家计数以显示每个大陆的数量