增加指针与添加到指针

时间:2016-06-22 03:17:21

标签: c pointers for-loop increment

我在这里有点困境,我有两个代码,一个完美无缺,而第二个没有:

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;
}

3 个答案:

答案 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时,它们会被打印回来。