今天,在完成大小写转换时遇到了一个问题:
注释:本VS版本为2022,使用了更为安全的scanf_s()函数
代码如下:
#include <stdio.h>
#include <stdlib.h>
void daxiaoxie(char *p,int n)
{
int i;
for (i = 0; i < n; i++)
{
if (p[i] >= 'A' && p[i] <= 'Z')
{
p[i] = p[i] + 32;
}
}
for (i = 0; i < n; i++)
{
printf("%c", *(p + i));
}
}
int main()
{
int i = 0;
int n;
scanf_s("%d", &n);
char* p = (char*)malloc(sizeof(char) * n);
if (p == NULL)
{
printf("内存空间不足");
}
else
{
for (i = 0; i < n; i++)
{
scanf_s("%c", p + i);
}
}
daxiaoxie(p, n);
free(p);
return 0;
}
当我输入5时
结果只有四个字符显示,b没有显示出来。
后来,经过查阅资料,我发现
改代码在使用 scanf_s
函数读取整数后,输入缓冲区中可能残留一个换行符'\n'
。这个换行符是由用户按下回车键后产生的,用于表示输入的结束。但是,这个换行符还存在于缓冲区,没有清除掉。当你接着用 scanf_s
函数读取字符时,如果输入缓冲区中存在换行符('\n'),
scanf_s(" %c", p + i);会将这个换行符读取为第一个字符,而不是等待用户输入。所以会出现这个问题。
改正方法:
方法一
加入getchar函数
使用 getchar()
来读取并丢弃缓冲区中的换行符或其他多余的字符,在读取完整数后,加入getchar函数。
方法二
加入空格
使用 scanf_s
的空格前缀跳过所有前导空白字符,包括换行符
更正后的结果为: