C/C++ scanf 函数中%s 和%c 的简单区别

首先声明:在键盘中敲入字符后,字符会首先保存在键盘缓冲区中供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);

例:

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

输出:123

           345

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

例:

输入:123回车

        456回车

输出:123

           456

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

例:

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

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


代码:

char *s;

scanf("%s",s);

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

scanf("%c",s);

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

例:

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

输出:1234

           32(空格的ASCII为32)

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


事例2:

输入:123回车

输出:123

           10(\n的ASCII为10)

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

在VS Code使用Code Runner插件来运行C/C++代码时,如果遇到命令提示窗口(CMD终端)输出以及`scanf`函数处理文字符时显示乱码的问题,这通常是因为编码设置未正确配置。解决这个问题需要按照以下步骤操作: 1. 确保终端的默认编码设置:打开VS Code,转到"文件" > "首选项" > "设置",然后搜索"terminal.integrated.shell.windows"。在这里,确认`"shellArgs"`数组的第一个元素(通常是`"-ansi"`)是否包含了正确的编码支持,如`"-encoding.cp65001"`,它对应GBK编码。 ```json { "terminal.integrated.shell.windows": "C:\\Windows\\System32\\cmd.exe", "terminal.integrated.shellArgs.windows": [ "-encoding.cp65001" ] } ``` 2. 对于`scanf`接收到文乱码:你需要在程序指定输入流的编码。在C++,可以使用`freopen`函数重定向标准输入,并设置合适的编码,例如UTF-8。 ```cpp #include <cstdio> ... FILE* input = freopen("stdin", "r", stdin, new FILE *{fopen("CONIN$|notepad", "rb")}); ``` 3. 编译选项:如果你使用的是 Mingw 或者 Gcc,可以尝试添加`-std=c11 -stdlib=libc++`选项,有时候这对处理宽字符有帮助。 4. 如果以上步骤还无法解决问题,可以在`Code Runner`配置手动指定输入和输出文件的编码。打开Code Runner的配置(`.vscode/settings.json`),找到`"runInTerminal": true`下面的`"args"`部分,添加`-finput-charset=utf-8`和`-fexec-charset=utf-8`。 完成上述调整后,重启VS Code并试运行你的C/C++代码,应该能看到正确的文输出了。记得检查你的项目源文件是否也使用了兼容的编码。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值