为什么我用putchar()打印垃圾;在这个for循环?

时间:2013-05-24 13:58:35

标签: c getchar putchar

我正在努力教自己C,因为你可能已经听过很多次了,我无法弄清楚我做错了什么。我正在做的练习的目的是用指定数量的空格替换制表符。它应该是unix命令扩展的模仿。这是我到目前为止所做的:

#include <stdio.h>

int main (int argc, char *argv[]) 
{
    int spacecount = atoi(argv[2]);
    int i, d, b, g, toput;
    char string[1000];

    for (d = 0, b = 0; (string[d + b] = getchar()) != EOF; d++) {
        if (string[d + b] = '\t') {
            toput = d % spacecount;
            for (i = 0; i < toput; i++) {
                if (string[d + b] = '\n')
                    i = toput;
                string[d + b] = ' ';
                b++;
            }
        }
    }
    g = d;

    putchar('\n');

    for (d = 0; d < g; d++)
        putchar(string[d]);
    putchar('\n');
}

我运行它并将开始输入,通过按ctrl + d完成,(因为我使用的是GNU / Linux)并让它打印垃圾字符。我用另一个字符串尝试了相同的第二个for循环,一个在没有if语句的for循环中分配了getchar(),并且它打印了非垃圾字符。我想我真的很困惑。我做错了什么?

2 个答案:

答案 0 :(得分:3)

在编译器中启用警告,它确实应该为您提供此代码的警告。

(string[d + b] = '\t')应为(string[d + b] == '\t')

使用gcc -std=c99 -pedantic-errors -Wall进行编译。

答案 1 :(得分:0)

问题是您要使用=运算符而不是==进行比较。 =是一个asign运算符,您无法使用它来比较两个元素。

所以使用

if (string[d + b] == '\t')

而不是

if (string[d + b] = '\t')

也可以使用

if (string[d + b] == '\n')

而不是

if (string[d + b] = '\n')