关于C语言中 scanf prinf 的问题。
发布网友
发布时间:2022-04-28 12:51
我来回答
共6个回答
热心网友
时间:2023-10-09 12:24
不太明白楼主的意思,但我想要说的是printf输出数组时只要遇到'\0'就结束输出;
还有
scanf("%s",a);
scanf(" %s",b);
假如你输入a后,回车,那么回车也算一个字符赋给了b[0],注意!追问我的意思就是如果定义数组为:a[3],b[4]。那么当我连续输入3个字符 再按空格键后 再连续输入4个字符。这时安enter键后,输出就有问题了。至于你说的回车也算一个字符,我在第二个scanf(" %s",b)中的%s前已经输入了一个空格键了。
追答空格也算一个字符,
scanf("%s",a);输入完成后,按键盘任意键都会赋值给b[0]
scanf(" %s",b);
解决办法
scanf("%s",a);
fflush(stdin);
scanf(" %s",b);
热心网友
时间:2023-10-09 12:24
/*会调试的话,你直接看内存便知。 ymj4645说的对。另外一则帮助你理解的代码,可以显示内存地址*/
#include<stdio.h>
int main()
{
char a[4];
char b[3];
scanf("%s",a);
scanf(" %s",b);
printf("[%#x]:%c\n",&a[0],a[0]);
printf("[%#x]:%c\n",&a[1],a[1]);
printf("[%#x]:%c\n",&a[2],a[2]);
printf("[%#x]:%c\n",&a[3],a[3]);
printf("[%#x]:%c\n",&b[0],b[0]);
printf("[%#x]:%c\n",&b[1],b[1]);
printf("[%#x]:%c\n",&b[2],b[2]);
printf("%s\n%s\n",a,b);
return 0;
}
热心网友
时间:2023-10-09 12:25
char a, b;
printf("value of a:");
scanf("%c", &a);
fflush(stdin);
printf("value of b:");
scanf("%c", &b);
输入a后,回车被认为是下一个字符,所有要清一下缓冲。
热心网友
时间:2023-10-09 12:25
很简单的一点可以告诉你
你输入第一个字符串的时候到ASC码的\0结束的,但是你依然录入了一个回车换行,这样下次输入的时候会把字符串记录在回车之后
而printf的规则是%s遇到\0就结束,所以第二次读取的时候读取到了一个\n
建议你到网上看一下scanf和printf的规则,你可以man 3 printf和man 3 scanf来查看规则,了解规则以及数据在内存上的分布你就会聊及你的程序出现的问题
热心网友
时间:2023-10-09 12:26
字符串需要以'\0'结束,注意。
比如char a[2];那么最多只能输入一个字符。
printf("%s"...
puts(...
都是以'\0'做打印结束标志
热心网友
时间:2023-10-09 12:27
ymj4645已说得明白。
热心网友
时间:2023-10-09 12:24
不太明白楼主的意思,但我想要说的是printf输出数组时只要遇到'\0'就结束输出;
还有
scanf("%s",a);
scanf(" %s",b);
假如你输入a后,回车,那么回车也算一个字符赋给了b[0],注意!追问我的意思就是如果定义数组为:a[3],b[4]。那么当我连续输入3个字符 再按空格键后 再连续输入4个字符。这时安enter键后,输出就有问题了。至于你说的回车也算一个字符,我在第二个scanf(" %s",b)中的%s前已经输入了一个空格键了。
追答空格也算一个字符,
scanf("%s",a);输入完成后,按键盘任意键都会赋值给b[0]
scanf(" %s",b);
解决办法
scanf("%s",a);
fflush(stdin);
scanf(" %s",b);
热心网友
时间:2023-10-09 12:24
/*会调试的话,你直接看内存便知。 ymj4645说的对。另外一则帮助你理解的代码,可以显示内存地址*/
#include<stdio.h>
int main()
{
char a[4];
char b[3];
scanf("%s",a);
scanf(" %s",b);
printf("[%#x]:%c\n",&a[0],a[0]);
printf("[%#x]:%c\n",&a[1],a[1]);
printf("[%#x]:%c\n",&a[2],a[2]);
printf("[%#x]:%c\n",&a[3],a[3]);
printf("[%#x]:%c\n",&b[0],b[0]);
printf("[%#x]:%c\n",&b[1],b[1]);
printf("[%#x]:%c\n",&b[2],b[2]);
printf("%s\n%s\n",a,b);
return 0;
}
热心网友
时间:2023-10-09 12:25
char a, b;
printf("value of a:");
scanf("%c", &a);
fflush(stdin);
printf("value of b:");
scanf("%c", &b);
输入a后,回车被认为是下一个字符,所有要清一下缓冲。
热心网友
时间:2023-10-09 12:25
很简单的一点可以告诉你
你输入第一个字符串的时候到ASC码的\0结束的,但是你依然录入了一个回车换行,这样下次输入的时候会把字符串记录在回车之后
而printf的规则是%s遇到\0就结束,所以第二次读取的时候读取到了一个\n
建议你到网上看一下scanf和printf的规则,你可以man 3 printf和man 3 scanf来查看规则,了解规则以及数据在内存上的分布你就会聊及你的程序出现的问题
热心网友
时间:2023-10-09 12:26
字符串需要以'\0'结束,注意。
比如char a[2];那么最多只能输入一个字符。
printf("%s"...
puts(...
都是以'\0'做打印结束标志
热心网友
时间:2023-10-09 12:27
ymj4645已说得明白。