scanf函数中%s和%c的简单区别——个人见解

本文详细解析了C语言中使用scanf函数进行字符串输入时的行为,包括如何处理空格、换行符以及连续输入的情况,并通过具体示例展示了不同输入方式对程序的影响。

首先声明:在键盘中敲入字符后,字符会首先保存在键盘缓冲区中供scanf函数读取(scanf,getchar等函数是读取缓冲区,getch函数是读取的控制台信息,即为直接从键盘读取)。另外特别注意键盘上敲入回车实际为“\r\n”,但存储到缓冲区时候会舍弃‘\r’而只存储\n.例如我们敲入字符“12345回车”,缓冲区内存储的为“12345\n”.

文章中“_”代表空格

代码:

char *s;

scanf("%s",s);

printf("%s\n",s);

scanf("%s",s);

printf("%s\n",s);


事例1:

输入:123_345回车            “_”代表空格

输出:123

           345

原因:对于scanf以%s格式输入时候,“空格、换行符、TAB”等是作为两个数据的分隔符存在的,即分隔符前后是两个数据,读入时候分隔符不读入。


事例2:

输入:123回车

        456回车

输出:123

           456

原因:如事例1,输入123回车后,缓冲区内存的是123\n,第一次读入后,缓冲区内只剩余了\n,当第二次读入时候,\n是以分隔符存在的,不读入第二次的是,故缓冲区中是没有数据存在的,所以需要继续输入数据。


事例3:

输入:_回车                     “_”代表空格

这种输入会要求一直输入,这是因为空格和\n都是分隔符,没有数据,所以没办法读入。同样直接输入回车也是一直要求输入


代码:

char *s;

scanf("%s",s);

printf("%s\n",s);

scanf("%c",s);

printf("%d\n",*s);


事例1:

输入:1234_12回车                     “_”代表空格

输出:1234

    32(空格的ASCII为32)

原因:对于第一个%s读入时遇到分隔符“空格”就停止,但是空格还是保存在缓冲区的。对于%c读入时候,“空格、\n、TAB”等是正常字符,所以第二次读入时候读取缓冲中的第一个字符“空格”,所以输出的是32.


事例2:

输入:123回车

输出:123

           10(\n的ASCII为10)

原因:%s读入后缓冲中指剩下了\n故第二次以%c读入时候就读入了\n,输出为10.

在C语言里,`getchar` 本身并非使用 `%c`,它是一个专门用于从标准输入读取单个字符的函数;而 `scanf` 是格式化输入函数,`%c` 是其用于读取单个字符的格式说明符。二者存在以下区别: ### 功能特性 - **`getchar`**:仅能读取单个字符,每次调用就从输入流读取一个字符,不管这个字符是可见字符、空格,还是换行符等。例如: ```c #include <stdio.h> int main() { char ch = getchar(); printf("你输入的字符是: %c\n", ch); return 0; } ``` - **`scanf`**:可以根据不同的格式说明符,读取多种类型的数据。当使用 `%c` 时,它读取单个字符,不过会受输入缓冲区格式控制的影响。例如: ```c #include <stdio.h> int main() { char ch; scanf("%c", &ch); printf("你输入的字符是: %c\n", ch); return 0; } ``` ### 对输入缓冲区的处理 - **`getchar`**:直接从输入缓冲区读取一个字符,若缓冲区有字符,就直接读取;若没有,程序会等待用户输入。 - **`scanf`**:使用 `%c` 读取字符时,默认不会跳过空白字符(空格、制表符、换行符)。比如,在输入流中有换行符存在时,`scanf("%c", &ch)` 会直接读取这个换行符。若要跳过空白字符,可在 `%c` 前加空格,像 `scanf(" %c", &ch)` 这样。例如: ```c #include <stdio.h> int main() { char ch1, ch2; scanf("%c", &ch1); scanf(" %c", &ch2); printf("第一个字符: %c, 第二个字符: %c\n", ch1, ch2); return 0; } ``` ### 使用场景 - **`getchar`**:适用于只需读取单个字符,且要对字符逐个处理的情况,像字符统计、字符过滤等操作。 - **`scanf`**:当程序需要从输入中读取多种类型的数据,且对输入格式有一定要求时,使用 `scanf` 结合不同的格式说明符会更合适。 ### 代码示例对比 ```c // 使用getchar读取字符 #include <stdio.h> int main() { char ch; ch = getchar(); printf("getchar读取的字符: %c\n", ch); return 0; } // 使用scanf读取字符 #include <stdio.h> int main() { char ch; scanf("%c", &ch); printf("scanf读取的字符: %c\n", ch); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值