【问题标题】:Counting the number of characters in C language计算C语言中的字符数
【发布时间】:2020-02-15 07:49:44
【问题描述】:

我是 C 语言的初学者,现在正在尝试计算输入的字符数。

#include <stdio.h>

main()
{
    long nc;
    nc = 0;
    while (getchar() != EOF)
        ++nc;
    printf("%1d\n", nc);
}

这是我按照教科书写的,但是printf函数似乎不起作用。

另外,这个程序似乎没有完成,因为提示没有出现。

我不知道这本书的内容是否足够老了。

你能告诉我这段代码有什么问题吗?

【问题讨论】:

  • 这看起来像是来自 K&R 的代码。还有其他人遇到了同样的问题,将%ld 误解为%1d。鉴于nc 的类型为long,您需要%ld(字母ell)。这本书包含一个 ell 而不是一个。使用main() 表明该书已过时(1988 年为第二版)。 C99 需要返回类型,并在参数列表中首选 voidint main(void)
  • 您好密切的选民,我建议不要将此问题视为错字。 John 从 OP 的角度巧妙地解释了一个完全不同的问题。
  • 上一个问题是No output display for the codes written as per C Programming Language by Brian W Kernighan and Dennis M Ritchie,但现在已关闭。那个有一些额外的错别字。
  • 如果您启用警告(您应该始终这样做),编译器会为您指出问题,例如“警告:格式‘%d’需要‘int’类型的参数,但参数2的类型为‘long int’”。使用 GCC,您可以使用 -Wall 标志。

标签: c while-loop printf getchar


【解决方案1】:

这看起来像是来自 K&R 的代码 The C Programming Language, 2nd Edn (1988),第 1 章,第 18 页。

问题在于您对代码的转录将%ld 误解为%1d。鉴于nc 的类型为long,您需要%ld(字母ell)而不是%1d(数字一)。这本书包含一个 ell 而不是一个。

使用合适的选项,像 GCC 和 Clang 这样的编译器会给出格式字符串中类型不匹配的警告。当代码格式错误时使用-Wall -Werror 来获取错误(或者-Wformat 如果你不能使用-Wall - 但我使用-Wall -Wextra -Werror 加上一些额外的复杂选项用于我的所有编译;我不会冒险编译器可以告诉我的错误)。

main() 的使用表明该书已过时。当您不使用命令行参数时,C99 需要返回类型并首选参数列表中的 voidint main(void)

至于程序未完成,当您在终端输入时,您在大多数类 Unix 系统上通过输入 Control-D 向程序指示 EOF(文件结尾)(尽管它是可配置的),以及 Windows 系统上的 Control-Z。 (如果您想在不立即输入换行符的情况下指示 EOF,则需要输入 EOF indicator twice 而不是一次。)或者您可以从 shell 中输入一个文件:counter &lt; data-file(假设程序名为 @987654337 @ 并且您要计算文件中的字符 data-file)。

【讨论】:

  • 如您所料,这是来自 K&R。而且我已经修复了您指出的一些类型不匹配,此外我现在已经了解 EOF 的真正含义。当我返回提示时,我一直使用 Contrl-C,这就是为什么 printf 函数不能正常工作的原因。非常感谢您的建议,这是非常正确的。这是我第一次使用这个网站,我现在很满意。
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 2012-05-14
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 2021-12-10
  • 2014-05-08
相关资源
最近更新 更多