C语言中字符数的计算

C语言中字符数的计算,c,while-loop,printf,getchar,C,While Loop,Printf,Getchar,我是C语言的初学者,现在正在尝试计算输入的字符数 #include <stdio.h> main() { long nc; nc = 0; while (getchar() != EOF) ++nc; printf("%1d\n", nc); } #包括 main() { 长nc; nc=0; while(getchar()!=EOF) ++数控; printf(“%1d\n”,nc); } 这是我写的,就像我的教科书写的一样,但

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

#include <stdio.h>

main()
{
    long nc;
    nc = 0;
    while (getchar() != EOF)
        ++nc;
    printf("%1d\n", nc);
}
#包括
main()
{
长nc;
nc=0;
while(getchar()!=EOF)
++数控;
printf(“%1d\n”,nc);
}
这是我写的,就像我的教科书写的一样,但printf函数似乎不起作用

此外,该程序似乎没有完成,因为没有出现提示

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


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

这看起来像是K&R的代码 (1988),第1章,第18页

问题是您的代码转录错误地将
%ld
理解为
%1d
。鉴于
nc
类型为
long
,您需要
%ld
(字母ll)而不是
%1d
(数字1)。这本书有一个字母,没有一个字母

有了合适的选项,GCC和Clang等编译器将对格式字符串中的类型不匹配发出警告。当代码格式错误时,使用
-Wall-Werror
获取错误(或者如果您无法使用
-Wall
,则使用
-Wall-Wextra-Werror
获取错误,但我使用
-Wall-Wextra-Werror
以及一些额外的更繁琐的选项来完成所有编译;我不会冒险犯编译器可以告诉我的错误)

使用
main()
表明这本书已经过时。C99需要返回类型,并且在不使用命令行参数时,更喜欢参数列表中的
void
-
int main(void)


至于未完成的程序,当您在终端上键入时,您可以通过在大多数类似Unix的系统上键入Control-D(尽管它是可配置的)和在Windows系统上键入Control-Z来向程序指示EOF(文件结束)。(如果您希望在不立即键入换行符的情况下指示EOF,则需要键入而不是仅键入一次。)或者您可以从shell向其提供一个文件:
counter
(假设程序名为
counter
,并且您希望对文件
数据文件中的字符进行计数).

这看起来像是K&R的代码 (1988),第1章,第18页

问题是您的代码转录错误地将
%ld
理解为
%1d
。鉴于
nc
类型为
long
,您需要
%ld
(字母ll)而不是
%1d
(数字1)。这本书有一个字母,没有一个字母

有了合适的选项,GCC和Clang等编译器将对格式字符串中的类型不匹配发出警告。当代码格式错误时,使用
-Wall-Werror
获取错误(或者如果您无法使用
-Wall
,则使用
-Wall-Wextra-Werror
获取错误,但我使用
-Wall-Wextra-Werror
以及一些额外的更繁琐的选项来完成所有编译;我不会冒险犯编译器可以告诉我的错误)

使用
main()
表明这本书已经过时。C99需要返回类型,并且在不使用命令行参数时,更喜欢参数列表中的
void
-
int main(void)


至于未完成的程序,当您在终端上键入时,您可以通过在大多数类似Unix的系统上键入Control-D(尽管它是可配置的)和在Windows系统上键入Control-Z来向程序指示EOF(文件结束)。(如果您希望在不立即键入换行符的情况下指示EOF,则需要键入而不是仅键入一次。)或者您可以从shell向其提供一个文件:
counter
(假设程序名为
counter
,并且您希望对文件
数据文件中的字符进行计数).

这看起来像是K&R的代码。还有其他人遇到了同样的问题,将
%ld
误解为
%1d
。鉴于
nc
的类型为
long
,您需要
%ld
(字母ell)。这本书有一个字母,没有一个字母。使用
main()
可以看出这本书的年代(第二次Edn是1988年)。C99需要返回类型,并且在参数列表中更倾向于<代码>空白>代码>:<代码> int main(Valuy)< /代码>。约翰从OP的角度巧妙地解释了一个完全不同的问题。前一个问题是,但现在已经结束了。其中有一些额外的输入错误。如果您启用警告(您应该一直这样做),编译器将为您指出问题所在,例如“警告:格式“%d”要求参数类型为“int”,但参数2的类型为“long int”。有了GCC,您可以使用-Wall标志。这看起来像是K&R的代码。还有其他人遇到了同样的问题,将
%ld
误解为
%1d
。鉴于
nc
的类型为
long
,您需要
%ld
(字母ell)。这本书有一个字母,没有一个字母。使用
main()
可以看出这本书的年代(第二次Edn是1988年)。C99需要返回类型,并且在参数列表中更倾向于<代码>空白>代码>:<代码> int main(Valuy)< /代码>。约翰从OP的角度巧妙地解释了一个完全不同的问题。前一个问题是,但现在已经结束了。其中有一些额外的输入错误。如果您启用警告(您应该一直这样做),编译器将为您指出问题所在,例如“警告:格式“%d”要求参数类型为“int”,但参数2的类型为“long int”。有了GCC,您可以使用-Wall标志。正如您所猜测的,这是来自K&R的。我已经修复了您指出的一些类型不匹配,而且我现在已经理解了EOF的真正含义。当我返回提示符时,我总是使用Contrl-C,这就是为什么printf功能不能很好地工作的原因。非常感谢你的建议,这是真的