我在这里有点困境,我有两个代码,一个完美无缺,而第二个没有:
for (;(*(s + i) = getchar()) != EOF && *(s + i) != '\n' && i < len; ++i)
根本不起作用。虽然这个有效:
for(;(*s = getchar()) != EOF && *s != '\n' && i < len; ++i, ++s);
s -= i;
我不明白为什么第一个人根本不工作?
编辑: 我在linux机器上使用gcc,当我按CTL + D时,第一个例子根本没有反应。
以下是完整代码:
int getLine (char *s, int len) {
int i = 0;
printf("IN");
for (i = 0 ; i < len && (*(s + i) = getchar()) != EOF && *(s + i) != '\n' ; ++i) {
printf("INIT");
}
*(s + i) = '\0';
return i;
}
答案 0 :(得分:4)
假设在循环之前将i
初始化为零,则两个循环是等效的。
但是,假设len
表示s
指向的缓冲区的长度,则两个片段都包含未定义的行为:当i
到达len
时,分配给*(s+i)
{1}}在 i
检查超支之前已完成。这就是必须将i < len
检查移到条件前面的原因:
for (i = 0 ; i < len && (*(s + i) = getchar()) != EOF && *(s + i) != '\n' ; ++i) {
...
}
答案 1 :(得分:2)
核心问题是您的代码不必要地模糊不清,因此您无法轻易说出它的作用。我认为dasblinkenlight的回答指出了具体的错误。
考虑编写可读代码,其中循环很简单。编写代码,清楚地知道它们有什么副作用,以及何时相对于彼此执行/排序:
AbsoluteLayout.LayoutFlags="All"
作为奖励,编译器可能能够生成更多缓存友好的代码,因此这也可能比您拥有的更快。
答案 2 :(得分:1)
好吧,我尝试了两个循环语句,它运行正常。我没有在语句中看到问题(除了布尔表达式的排序)。请发布更多代码。
char s[10];
int len = 9;
int i = 0;
for (;i<len && (*(s + i) = getchar()) != EOF && *(s + i) != '\n';++i);
s[i] = 0;
printf("%s\n",s);
好吧,当我输入一些字符后按Ctrl + D时,它们会被打印回来。