我正在阅读C语言程序,并且到目前为止已经理解了所有内容.然而,当我遇到getchar()
并且putchar()
,我无法理解它们的用途,更具体地说,以下代码的作用.
main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
}
Run Code Online (Sandbox Code Playgroud)
我理解main()
函数,整数的声明c
和while
循环.然而我对while
循环中的条件感到困惑.这个C代码的输入是什么,输出是什么.
对不起,如果这是一个基本而愚蠢的问题,但我只是在寻找一个简单的解释,然后再继续阅读本书并变得更加困惑.
在C中,字符串是char(char *
)数组,字符通常存储在其中char
.我注意到libC中的一些函数将作为参数整数而不是char.
例如,让我们的职能toupper()
和tolower()
两个使用int
.手册页说:
如果c不是无符号字符值或EOF,则这些函数的行为是未定义的.
我的猜测是,有一个int
,toupper
并且tolower
能够处理unsigned char
和EOF
.但实际上EOF
是在实践中(有没有关于它的值的规则?)一个可以用a存储的值char
,并且由于这些函数不会转换EOF
成其他东西,我想知道为什么toupper
不简单地将char作为参数.
在任何情况下,为什么我们需要接受不是字符的东西(例如EOF)?有人能为我提供相关的用例吗?
这与fputc
或类似putchar
,也可以将int
其转换为unsigned char
无论如何.
我正在寻找这种选择的确切动机.我想说服,我不想回答,我不知道有一天有人问我.
如果我在标准输入流中键入"Hello World"字样,该程序将打印出奇怪的盒子符号,而不是预期的"Hello World",返回标准输出.
#include <stdio.h>
int main(void)
{
// print out all characters from the stream until '/n' character is found
int ch;
while (ch = getchar() != '\n')
{
putchar(ch);
}
putchar('\n');
}
Run Code Online (Sandbox Code Playgroud)
我知道如何解决这个问题.但为什么这行代码不正确?
while (ch = getchar() != '\n')
Run Code Online (Sandbox Code Playgroud) 我目前在1.5.1文件复制中,并制作了一个类似的程序:
#include <stdio.h>
/* copy input to output; 1st version */
main()
{
int c;
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我像这样运行它:
PS <..loc..> cc copy-0.c
PS ./a
Black
Black
White
White
Gray
Gray
Run Code Online (Sandbox Code Playgroud)
输出是我输入的.
这是我为实验目的而制作的一个程序:
#include <stdio.h>
/* copy input to output; 1st version */
main()
{
int c;
c = getchar();
while (c != EOF) {
printf("%c",c);
c = getchar();
}
}
Run Code Online (Sandbox Code Playgroud)
它产生相同的结果但是putchar
和之间存在差异printf
吗?
两者之间哪个更好用?
例如,如果我不应该使用像printf,putchar这样的标准库函数,那么如何轻松地将字符打印到屏幕上.有没有简单的方法来做到这一点.我不太了解系统调用,如果我必须使用它们,那么如何?
那么任何一个建议都可以轻松打印而不使用库函数?
我试图了解它是如何putchar('0' + r);
工作的.下面,该函数采用整数并将其转换为二进制.
void to_binary(unsigned long n)
{
int r;
r = n % 2;
if (n >= 2)
to_binary(n / 2);
putchar('0' + r);
}
Run Code Online (Sandbox Code Playgroud)
我谷歌putchar的定义,但我没有找到这个.为了测试它,我添加了一个printf来查看r的值:
void to_binary(unsigned long n)
{
int r;
r = n % 2;
if (n >= 2)
to_binary(n / 2);
printf("r = %d and putchar printed ", r);
putchar('0' + r);
printf("\n");
}
Run Code Online (Sandbox Code Playgroud)
然后我运行它(键入5)并获得此输出:
r = 1并且putchar打印1
r = 0并且putchar打印0
r = 1并且putchar打印1
所以我认为putchar('0' + r);
如果r = 0 …
是a = getchar()
相当于scanf("%c",&a);
?
是putchar(a)
等同于printf("%c",a);
其中a
是一个char
变量?
我正在阅读K&R的The C Programming Language,并对putchar和getchar感到困惑.我制作了一个程序,你输入10个字符,程序将它们打印回屏幕.
#include <stdio.h>
int main()
{
int i;
int ch;
for(i = 0; i < 10; i++)
{
printf("Enter a single character >> ");
ch = getchar();
putchar(ch);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望得到这样的输出:
Enter a single character >> a
a
Enter a single character >> b
b
Run Code Online (Sandbox Code Playgroud)
...等等10次,但这是我得到的输出:(进入2个字符后我停止了)
Enter a single character >> a
aEnter a single character >>
Enter a single character >> b
bEnter a single character >>
Enter a single character >>
Run Code Online (Sandbox Code Playgroud)
不确定为什么我的输入字符与固定字符串组合并被输出.
另外,我不太清楚为什么使用int来存储字符.
我已经在这个工作了2个小时而且我被卡住了...我在网上找到了答案,但这不会帮助我学习我显然缺少的概念.
提示:编写程序将其输入复制到其输出,替换每个选项卡\t
,每个退格键\b
和每个反斜杠\\
.这使得标签和退格以明确的方式可见.
这是我提出的,它没有替换a tab
或\
与指示putchar
,它只是在它前面添加它.(我没有做退格,因为我无法真正输入退格...):
这就是我阅读代码的方式.我错过了什么?:
"有一些整数c
.c
等于输入.当输入不等于文件结束时继续.如果输入是tab然后输出\t
.如果输入\
则输出\\
.输入输出到控制台."
int c;
while((c=getchar())!=EOF)
{
if(c=='\t')
{
putchar('\\');
putchar('t');
}
if(c=='\\')
{
putchar('\\');
putchar('\\');
}
putchar(c);
}
Run Code Online (Sandbox Code Playgroud) I'm working through "The C Programming Language" by K&R and example 1.5 has stumped me:
#include <stdio.h>
/* copy input to output; 1st version */
int main(int argc, char *argv[])
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
I understand that 'getchar()' takes a character for 'putchar()' to display. However, when I run the program in terminal, why is it that I can pass an entire line of characters for 'putchar()' to display?