【问题标题】:K&R exercise 1-8. I can get my code to work correctlyK&R 练习 1-8。我可以让我的代码正常工作
【发布时间】:2017-10-24 04:10:34
【问题描述】:

我搜索但没有找到解决方案。 该程序应该计算制表符、换行符和空格。

#include <stdio.h>

int main(void)
{
    int c,nl,tab,blank;
    tab = 0;
    blank = 0;
    nl = 0;

    while((c = getchar()) != EOF)
    {
        if(c == '\n');
            nl++;
        if(c == '\t');
            tab++;
        if(c == ' ');
            blank++;
    }

    printf("newline: %d tab: %d blank: %d\n", nl,tab,blank);

    return 0;
}

当我在 FreeBSD 上使用 ctrl-d 来发出 EOF 信号时,每个变量都以相同的值显示。如果我输入 "helloblank 如何tabareenterenterctrl-d " 它将换行显示为 18,标签显示为 18,空白显示为 18。

我的代码错了吗?明明是这样,但怎么了?

【问题讨论】:

  • 去掉 if 语句末尾的分号,例如if(c == '\n'); -> if(c == '\n')。 (另外,这不是一个错误,但要学会正确地格式化你的代码。)
  • 谢谢,我的格式错误。 @PaulR
  • 如果使用gcc或者clang,用-Wall警告标志编译会发现这个问题
  • @MM 可以。谢谢。

标签: c command-line freebsd cc


【解决方案1】:

正如评论所说,这里的问题是你的 if 语句后面有分号。一般情况下,if 语句都用大括号括起来:

    if(foo) {
        //your code here
    }

试试看它是否有效!

【讨论】:

    【解决方案2】:

    if (something); 的字面意思是:如果有事,那么什么也不做if 语句语法使得如果条件something 为真,则将分号放在末尾会将其转换为要执行的空语句,因此如果条件声明,则什么也不做。当您在 if 语句之后递增三个变量时,您将让它们递增

    解决方案

    只需擦除条件右括号后的;,如:

    if(c == '\n') /* no semicolon here */
            nl++;
    

    在 FreeBSD 系统中:

    $ make pru$$
    cc -O -pipe  pru24720.c  -o pru24720
    $ pru$$ <pru$$.c
    newline: 23 tab: 0 blank: 123
    

    【讨论】:

    • 谢谢,我不知道你最后做了什么。我只是从 c 开始,所以我想我会努力做到这一点。而且我也开始学习 unix,所以很多事情都令人困惑,但我每天学习一点。
    • 好吧,当我在这里回答问题时,我总是调用文件pru$$.c,它用shell的pid替换$$,所以它得到一个不同的数字(并修复了所有外壳会话)。在这种情况下,shell pid 是24720,所以这是文件的名称......最后,我执行pru24720 重定向它从文件pru24720.c(源代码)的输入以获取行数您的示例代码、选项卡数和空格数。
    • 这是一个内置的 unix 命令还是你写的?
    • @clawhammer1234, make(1) 是标准的 unix 命令,用$$ 替换 pid 的 shell 也是 bourne shell sh(1)bash(1) 的标准。我只写了pru24720.c 来说明我的答案,没有别的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多