C语言中的getchar, scanf, putchar, printf学习

本文详细介绍了C语言中的输入输出功能,包括标准输入输出函数如getchar(), scanf(), putchar(), printf()等的基本用法和注意事项,同时提供了几种不同的输入整数序列的方法。

输入和输出功能并不是C语言本身的组成部分,他们属于标准库范围,使用输入输出相关函数是必须写:#include<stdio.h> 。文件名用尖括号括起来时,预处理器将到特定位置查找而不是在工程中。

 

常用的标准的输入输出有:

getchar(void), scanf(char *format, …); putchar(c),   printf(char*format, arg1, arg2 ,…)

 

C语言中,用Dos窗口输入数据时,长度满足输入函数要求并且按下了回车键才能结束本次输入。如果长度满足(包括超出)没有按下回车键,继续等待输入直到按下回车键,如果按下回车键但长度没有达到要求,继续等待输入,直到长度满足要求并且按下回车键。

输入结束后,输入函数接收完所需要的数据或者无法与输入数据匹配时结束(终止)执行。

超出的输入数据(包括回车符)停留在缓存中,等到下一次有输入函数时,传递给输入函数。

在char型的输入中空格、回车、换行等都当成字符处理。

而整形相关输入中,数据边界定义为下一个非数字字符或者指定的字符宽度,在非数字字符中,只有空白符(包括空格、制表符、回车、换页符)可以被自动被忽略。

 

输入:

 

int getchar(void)

从标准输入中(一般为键盘)一次读取一个字符,空格回车等都当成一个字符,是最简单的输入机制。

返回:调用时输入字符的ASCII值,遇到文件结尾,返回EOF(符号常量,一般为-1)。

使用“prog <输入文件名”实现输入重定向(改变输入源,例如把键盘输入改成文件输入)

文本流有一系列行组成,每一行的结尾是换行符,如果系统不遵行这种模式,标准库将其转变为该种模式,例如输入端把回车符和换页符都转换为换行符,输出端反向变换。

 

int scanf(char *format, …)

按照format的格式读入字符,存储在后面参数所代表的地方,因此后面的参数一定是地址(指针)。

返回:成功匹配并赋值的输入项个数,遇到文件结尾,返回EOF,下一个字符与格式说明不匹配,返回0(EOF与0不是同一个概念)

扫描完字符串或者碰到某些输入无法与控制字符匹配时,函数终止

 

intsscanf(char *string, char *format, arg1, arg2, …)

按照format格式扫描string中的字符,保存在arg1,arg2中,arg1,arg2也必须是地址(指针)。其他与scanf相同

文本流有一系列行组成,每一行的结尾是换行符,如果系统不遵行这种模式,标准库将其转变为该种模式,例如输入端把回车符和换页符都转换为换行符,输出端反向变换。

 

Format由三部分组成,”<空格制表符(通常省)> <普通字符(可省)> <转换说明(不可省)>”

空格和制表符在处理过程中被忽略。

普通字符(不包括%),用来严格的和输入流中的数据不对,若不相同,则后面的不能输入。

转换说明包括:

% <禁止符*(可省)> <数值(最大宽度,可省)> <h, l或L(对象宽度,可省)> <转换字符>

转换说明中有赋值禁止字符*,跳过该输入字段,不进行赋值。

执行scanf获得的数据个数由转换字符的个数决定。

转换字符含义参考其他说明。

 

输出:

 

int putchar(c)

函数putchar(c)将字符c送到标准输出上,默认情况下是显示屏。

返回:输出的字符,发生错误则返回EOF

使用“>输出文件名”实现输出重定向(改变输出地,例如把输出到屏幕改为某个文件)

文本流有一系列行组成,每一行的结尾是换行符,如果系统不遵行这种模式,标准库将其转变为该种模式,例如输入端把回车符和换页符都转换为换行符,输出端反向变换。

 

int printf(char *format, arg1, arg2 ,…)

在format的控制下打印。

返回:打印的字符数。

 

int sprintf( char *string, char*format, arg1, arg2, …)

功能与printf相同,但是输出到string中而不是标准的输出中,要保证string足够大。

文本流有一系列行组成,每一行的结尾是换行符,如果系统不遵行这种模式,标准库将其转变为该种模式,例如输入端把回车符和换页符都转换为换行符,输出端反向变换。

 

Format由两部分组成,”普通字符、转换说明”

普通字符直接输出到数据流里

转换说明不直接打印,控制printf中参数的转换和打印,格式为“%<格式控制>字符”

其中格式控制符为 -x.x样式,控制对其方式、宽度、精度(输出长度)等,字符控制输出的格式。

 

例:输入n(n不超过100)个整数,各个整数用逗号隔开。

方法一:

思路:利用getchar()函数逐个字节(字符)输入,找出逗号的位置。然后将逗号之间的字符转换成整形数放到数组里。

char str[100] = {0};

int num[50] = {0};

char comma[50] = {0};        

char i = 0,j = 0,k = 0;

 

str[i] = getchar();                //下面的输入是从str[1]开始,这里

while(10 != str[i++]){             //以回车符结束输入

str[i] = getchar();

if(str[i] == 44){                //记录逗号的位置

         comma[j++] = i;

}

}

comma[j] = i - 1; //i是回车符的位置(判断的时候执行了++),相当于最后一个逗号,j从开始,j+1为字符串中整数的个数

num_real = j;                   

for(i=(comma[0]-1);i>=0;i--)

num[0] = num[0] + (str[i]-48)*pow_self(++k);                      //解决第一个数,j=0无法确定下限       

k = 0;

for(;j>=1;j--){

for(i=(comma[j]-1);i>comma[j-1];i--)

num[j] = num[j] + (str[i]-48)*pow_self(++k);                      //num从开始,共j+1个数

          k = 0;

}

 

其中pow_self函数定义为:

int pow_self(char num)

{

   int cnt;

   int sum = 1;

   for(cnt =1;cnt<num;cnt++)

       sum = sum*10;

   return sum;

}

 

方法二:

Scanf和getchar配合,getchar负责接收逗号,逗号拥有空白符的功能。

int a[5] = {0};

int i = 0;

 

scanf("%d",&a[0]);

while(10 != getchar())         scanf("%d",&a[++i]);

 

方法三:

巧妙的利用scanf,依次扫描2个数,分别为整形和char型,char只是用来判断结尾

int a[5] = {0};

int i = 0;

char b = 0;

 

while(b != 10)

         scanf("%d%c",&a[i++],&b);

 

<think> 首先,用户的问题是:“我想了解C语言printfputchar的区别 请问C语言printf函数和putchar函数的区别”。我需要根据系统级指令和提供的引用来回答。 系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 提供的引用是关于C语言输出函数的: - 引用[1]:介绍putchar函数的基本用法。 - 引用[2]:讨论scanfprintf函数。 - 引用[3]:比较puts, printf, putchar, getchar。 - 引用[4]:getcharputchar的使用。 我需要聚焦于printfputchar的区别。 关键区别: 1. **功能**: - `putchar`:输出单个字符。它接受一个字符作为参数,并输出该字符。返回值是输出的字符或EOF。 - `printf`:输出格式化字符串。它可以输出多个字符、格式化数字等。 2. **使用方式**: - `putchar`:简单,只输出一个字符。例如,`putchar('A');` 输出'A'。 - `printf`:复杂,使用格式字符串指定输出格式。例如,`printf("Hello, %s\n", name);`。 3. **格式化**: - `putchar`:没有格式化能力。 - `printf`:支持多种格式说明符,如`%d`、`%c`、`%s`等。 4. **返回值**: - `putchar`:返回输入的字符的整型值(ASCII值)。 - `printf`:返回成功输出的字符数。 5. **换行行为**: - `putchar`:输出后不会自动换行;需要显式输出换行符如`putchar('\n')`。 - `printf`:可以通过格式字符串控制换行,如`printf("\n")`。 6. **效率**: - `putchar`:更高效,因为它只处理单个字符。 - `printf`:由于格式化解析,可能较慢。 7. **头文件**: - 两者都需要包含`<stdio.h>`。 从引用中提取信息: - 引用[1]:putchar输出单个字符,返回整型值。 - 引用[2]:printf用于格式化输出。 - 引用[3]:比较了puts和printf;puts输出字符串并自动换行,printf更灵活。 - 引用[4]:getchar输入字符,putchar输出字符。 在回答中,我需要自然地添加引用标识。例如,如果提到putchar的返回值,可以引用[1]。 回答结构: 1. **介绍**:简要概述printfputchar。 2. **详细比较**:逐步列出区别。 3. **示例**:提供简单的代码示例说明用法。 4. **总结**:强调关键区别。 5. **生成相关问题**:在末尾添加相关问题列表。 用户指定了“参考站内引用”,所以我要整合引用内容。 最后,生成相关问题: - 类似示例中的格式:"§§相关问题§§",然后列出问题。 确保使用中文。 </think> ### C语言printf函数与putchar函数的区别 在C语言中,`printf`和`putchar`都是标准输出函数(定义在`<stdio.h>`头文件中),用于向控制台输出数据。它们的主要区别在于功能、用法、灵活性和效率。下面我将逐步解释这些区别,以帮助您清晰地理解它们的特性和适用场景。 #### 1. **功能区别** - **putchar函数**:专门用于输出**单个字符**。它接受一个整数参数(通常是字符的ASCII值),并将其转换为字符输出到屏幕。返回值是输出的字符的ASCII值(如果成功)或`EOF`(出错时)。例如: ```c putchar('A'); // 输出字符 'A' ``` 它没有任何格式化能力,只处理一个字符[^1]。 - **printf函数**:用于输出**格式化字符串**,支持多种数据类型(如整数、浮点数、字符串等)。它使用格式说明符(如`%d`、`%c`、`%s`)来指定输出格式,并可以输出多个字符或完整字符串。返回值是成功输出的字符数(不包括结尾的`'\0'`)。例如: ```c printf("Value: %d, Char: %c\n", 42, 'A'); // 输出"Value: 42, Char: A",并换行 ``` 它更灵活,常用于复杂输出[^2]。 #### 2. **用法区别** - **putchar**: - 语法简单:`int putchar(int character);` - 输出后**不会自动换行**,需要手动添加换行符(如`putchar('\n')`)。 - 示例代码: ```c #include <stdio.h> int main() { char c = 'X'; int result = putchar(c); // 输出 'X' printf("\nReturn: %d\n", result); // 输出返回值(ASCII值) return 0; } ``` 这里,`putchar`只输出一个字符,返回值是`'X'`的ASCII值(88)[^1]。 - **printf**: - 语法复杂:`int printf(const char *format, ...);`,允许可变参数。 - 可以通过格式字符串**控制换行**(如`printf("Text\n")`)。 - 示例代码: ```c #include <stdio.h> int main() { char c = 'Y'; int count = printf("Character: %c\n", c); // 输出"Character: Y"并换行 printf("Chars printed: %d\n", count); // 输出成功输出的字符数 return 0; } ``` 这里,`printf`输出格式化字符串,并返回字符数(包括换行符)[^2][^3]。 #### 3. **格式化与灵活性** - **putchar**:无格式化功能。它只接受一个整数参数,将其直接转换为字符输出。适用于简单字符输出场景,如循环中逐个输出字符[^4]。 - **printf**:支持丰富的格式化选项,例如: - `%d`:格式化整数。 - `%c`:格式化字符。 - `%s`:格式化字符串。 这使得`printf`能处理混合数据类型输出,但解析格式字符串可能带来额外开销[^2][^3]。 #### 4. **返回值与性能** - **返回值**: - `putchar`返回输出的字符的ASCII值(int类型)。 - `printf`返回成功输出的字符总数(int类型)。 - **性能**: - `putchar`更高效,因为它是轻量级函数,只处理单个字符操作。 - `printf`效率较低,因为它需要解析格式字符串,适合复杂输出但可能在高频调用时影响性能[^1][^2]。 #### 5. **适用场景总结** | 特性 | putchar | printf | |--------------|-------------------------------------|--------------------------------------| | 输出类型 | 单个字符 | 格式化字符串(多字符/混合数据) | | 自动换行 | 否(需手动`putchar('\n')`) | 是(可通过`\n`控制) | | 格式化支持 | 无 | 丰富(如`%d`, `%c`, `%s`) | | 返回值 | 输出的字符ASCII值 | 成功输出的字符数 | | 效率 | 高(简单字符输出) | 较低(格式解析开销) | | 最佳场景 | 循环输出单个字符、简单调试 | 复杂日志、用户提示、多数据输出 | 例如,在需要循环输出字符串中的每个字符时,`putchar`更合适: ```c #include <stdio.h> int main() { char str[] = "Hello"; for (int i = 0; str[i] != '\0'; i++) { putchar(str[i]); // 逐个输出字符 } putchar('\n'); // 手动换行 return 0; } ``` 而在输出包含变量和文本的消息时,`printf`更高效: ```c #include <stdio.h> int main() { int age = 25; printf("Age: %d, Initial: %c\n", age, 'J'); // 输出"Age: 25, Initial: J"并换行 return 0; } ``` #### 总结 `printf`和`putchar`的核心区别在于:**`putchar`是专用的字符输出函数,简单快速但功能单一;而`printf`是通用的格式化输出函数,灵活强大但效率稍低**。选择哪个函数取决于输出需求:如果是单一字符输出,优先用`putchar`以减少开销;如果需要格式化混合数据,则用`printf`[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值