c - s[++i] 之间的区别;和 s[i];++i;

标签 c loops for-loop post-increment pre-increment

我正在做一些来自“C 编程语言”的练习,但无法弄清楚发生了什么才能给我特定的输出。不是真正的障碍,因为我得到了我想要的输出,但我不明白为什么改变我的代码的某个片段实际上给了我想要的输出。只是在寻找一个解释。

这是按我希望的方式工作的代码。我不理解的部分是 'k' for 循环中的 s[++i] = ' '; 。在我使用 s[++i] 之前,我使用了:

s[i] = ' ';

++i;

这只会在数组中放置 1 个空间,无论 k 循环运行了多少次。

然后,为了测试,我将 ++i; 置于 s[i] = ' '; 之上,并且我的输出中没有包含一个空格。

#include <stdio.h>
#define MAXLINE 1000
#define TABSTOP 5

/* Write a program "detab" that replaces tabs in the input with a proper
number of blanks to space to the next tab stop. Assume a fixed set of tab
stops, say every n columnns. Should n be a variable or a synbolic parameter? */


int main() {

  char c;
  int i, j;
  int modTabStop, numTabs, k;
  char s[MAXLINE];

  i = 0;
  while((c = getchar()) != EOF) {
    if(c == '\t') {
      modTabStop = i % TABSTOP;
      numTabs = TABSTOP - modTabStop;
      for(k = 0;k <= numTabs; ++k)
        s[++i] = ' ';
    }
    else if(c == '\n') {
      ;
    }
    else {
      s[i] = c;
      ++i;
    }
  }

  for(j = 0;j <= i;++j)
    printf("%c", s[j]);

  return 0;
}

我只是想知道为什么 s[++i] 有效而其他人都没有。我的预期输出在 main 函数上方的注释中定义。但为了澄清起见,我使用了测试字符串“the(tab)dog”。当它正常工作时,应该只用 2 个空格代替“the”和“dog”之间的制表符,因为我的制表位是 5,而“the”是三个字母长(“the(space)(space)dog” ).如果我将 ++i; 放在 s[i] = ' ' 之后,那么我会在两者之间得到一个空格(“the(space)dog”)。如果我把它放在前面,我就没有空格(“thedog”)。

我只是想确保在继续之前完全理解所有这些。谢谢大家!

最佳答案

对于这个循环的初学者

  for(k = 0;k <= numTabs; ++k)
              ^^^

不正确。它应该看起来像

  for(k = 0;k < numTabs; ++k)
              ^^^

在这种情况下,将在数组中插入恰好 numTabs 个空格,

这个作业

    s[++i] = ' ';

也是不正确的,因为 i 位置的字符没有改变。由于预递增运算符++i,该位置被跳过。

你应该改写

    s[i++] = ' ';

所以最后循环看起来像

  for(k = 0;k < numTabs; ++k)
    s[i++] = ' ';

注意这个循环

while((c = getchar()) != EOF) {

不正确。

你应该改写

while( i < MAXLINE && ( c = getchar() ) != EOF && c != '\n' ) {

或者至少喜欢

while( i < MAXLINE && ( c = getchar() ) != EOF ) {

在最后一种情况下,你应该在循环中编写

else if(c == '\n') {
  s[i++] = ' ';
}

否则,如果您输入多个语句,它们将不会被分开。

在第一种情况下,应删除此 if 语句。

而不是声明

char c;

你应该使用声明

int c;

因为 char 类型可以表现为 unsigned char 类型(取决于编译器选项)。在这种情况下,比较 c != EOF 将始终为真。

关于c - s[++i] 之间的区别;和 s[i];++i;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58644137/

相关文章:

c - 有没有办法自动打印 float 到它的小数位数?

loops - 分析循环中的周期时间抖动

MYSQL - 想要迭代位于 1 个表中的日期,并计算另一个表中的记录数

swift - 在 for 循环中更改 SKNode 子节点的属性

Java for循环问题

c - 获取同一程序中包含的路径

c - 是否有用于 C 的静态代码检查器会标记缺少的互斥锁解锁?

c - 在 C 中用空格分隔 scanf 输入

c - GLFW 无法正确链接

C : infinite loop in the input