【问题标题】:Why am I printing garbage with putchar(); in this for loop?为什么我用 putchar() 打印垃圾;在这个for循环中?
【发布时间】:2013-05-24 13:58:34
【问题描述】:

我正在尝试自学 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() 的字符串,它打印了非垃圾字符。我想我真的很困惑。我做错了什么?

【问题讨论】:

  • = 用于赋值,== 用于比较。不要混淆两者!
  • 当然!谢谢。

标签: c getchar putchar


【解决方案1】:

在你的编译器中启用警告,它确实应该给你这个代码的警告。

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

gcc -std=c99 -pedantic-errors -Wall编译。

【讨论】:

  • +1 不仅仅是为了代表而抛出答案。并考虑到 OP 是自学 C,提供了正确的编译器选项来进一步自学。
【解决方案2】:

问题是您正在比较使用 = 运算符而不是 === 是一个赋值运算符,你不能用它来比较两个元素。

所以用

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

而不是

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

也用

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

而不是

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

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2016-04-15
    • 2019-12-23
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    相关资源
    最近更新 更多