【发布时间】:2014-12-27 23:06:56
【问题描述】:
我们接到了这个任务,想知道我们是否在解决方案中忽略了某些东西:
以下代码片段有问题。它会编译,但存在一个重要的语义问题,这将导致代码的行为与预期不同。确定问题和解决此问题的方法。
int main(void)
{
char * s = malloc(82 * sizeof(char));
if(s==NULL)
{
perror("failed to allocate memory");
return EXIT_FAILURE;
}
fgets(s, sizeof(s), stdin);
if(s[strlen(s)-1] != '\n')
{
fprintf(stderr, "Error: you entered too much input");
free(s);
return EXIT_FAILURE;
}
free(s);
return EXIT_SUCCESS;
}
我们认为错误在于fgets 函数,因为它会读取包括空终止字符在内的所有内容。所以我们相信有可能写一个尚未malloc'd 的角色。所以我们相信fget(s,sizeof(s)-1, stdin); 行将是解决办法。
我们是对的吗?还是有更多/其他错误?
【问题讨论】:
-
您说“行为与预期不同”。你知道预期的行为是什么吗?
-
读起来就像是我剪下来的家庭作业。
-
@duffmo 不是家庭作业问题,它是 RMIT 大学高级编程技术的过去考试问题。但它肯定是从过去的纸上剪切和粘贴的。如果你有兴趣,我可以把过去的试卷发给你。
-
@Woodrow 我不知道预期的行为是什么。我买了这个,讲师说这个问题在没有上下文的情况下是模棱两可的。虽然很有趣。