C语言中定义了个char数组,有些不明白
这段代码有问题吗?为什么我输入5个以上的字节就弹窗,输入5个字节它就自动循环,只有输入4个字节才正常?太诡异啦#include<stdio.h>#include<stri...
这段代码有问题吗? 为什么我输入5个以上的字节就弹窗,输入5个字节它就自动循环,只有输入4个字节才正常?太诡异啦
#include <stdio.h>
#include <string.h>
main(){
char name[] = "";
printf("用户名:\n");
scanf("%s",&name);
printf("%s%d",name);
} 展开
#include <stdio.h>
#include <string.h>
main(){
char name[] = "";
printf("用户名:\n");
scanf("%s",&name);
printf("%s%d",name);
} 展开
3个回答
展开全部
出现这种情况的原因是隐藏的。
char name[] = "";这一句里将一个'\0'赋值给name数组,这时name数组并没有指定长度,但它是一个数组,也就是一个指针,指针在机器上一般是占用4个字节的。
所以在后来的scanf("%s",&name);语句里,你的输入格式是%s,而输入的是&name,也就是取地址符号,这就是问题的关键所在!
你取地址取的是name指针的地址,所以输入的字符都存放在name里面,但name只有4个字节(指针占4字节),这样就默认了name数组只能存放4个字符,每个字符占1个字节!其实在这里,name也可以说是数组,但其本质上是存放4个字节的存储空间。
因此,这里只能够输入4个字符!如果超出了4个字符,编译器会自动将超出的字符存放在后续的存储空间里,这里的后续不是接连的意思。但在printf("%s",name);输出时候,编译器没有检测到'\0',所以即使将输入的字符串全部输出,也会在输出最后一个字符后导致输出异常,停止输出。
如果输入没有超过4个字符,输入合法,在scanf("%s",&name);时候,编译器会在其末尾附加上'\0',当输出时候就正常输出。
char name[] = "";这一句里将一个'\0'赋值给name数组,这时name数组并没有指定长度,但它是一个数组,也就是一个指针,指针在机器上一般是占用4个字节的。
所以在后来的scanf("%s",&name);语句里,你的输入格式是%s,而输入的是&name,也就是取地址符号,这就是问题的关键所在!
你取地址取的是name指针的地址,所以输入的字符都存放在name里面,但name只有4个字节(指针占4字节),这样就默认了name数组只能存放4个字符,每个字符占1个字节!其实在这里,name也可以说是数组,但其本质上是存放4个字节的存储空间。
因此,这里只能够输入4个字符!如果超出了4个字符,编译器会自动将超出的字符存放在后续的存储空间里,这里的后续不是接连的意思。但在printf("%s",name);输出时候,编译器没有检测到'\0',所以即使将输入的字符串全部输出,也会在输出最后一个字符后导致输出异常,停止输出。
如果输入没有超过4个字符,输入合法,在scanf("%s",&name);时候,编译器会在其末尾附加上'\0',当输出时候就正常输出。
展开全部
#include <stdio.h>
#include <string.h>
main(){
char name[] = "";//这里定义太小了 所以弹窗
printf("用户名:\n");
scanf("%s",&name);//这里是不需要取地址的 把 &去掉
printf("%s%d",name);//这里 你%d是做什么?去掉
}
#include <string.h>
main(){
char name[] = "";//这里定义太小了 所以弹窗
printf("用户名:\n");
scanf("%s",&name);//这里是不需要取地址的 把 &去掉
printf("%s%d",name);//这里 你%d是做什么?去掉
}
更多追问追答
追问
哦 %d是手误 忘记删了,取址符去掉也一样的,怎么回事呀?
追答
char name[20]= "";
你再试试? 你数组里面不写它就默认是1个
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼主为啥不直接定义一个指针呢。
char *name;
name=(char *)malloc(30*sizeof(char));
scanf
printf
char *name;
name=(char *)malloc(30*sizeof(char));
scanf
printf
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询