以下是守则:
#include<stdio.h>
int main(){
char a[6]; // DECLARATION OF ARRAY OF CHARACTER WITH SIZE 6
printf("Enter ur Name :");
scanf("%s",a); // INITILISATION OF ARRAY
printf("\nName : %s\n",a); //PRITNTING WHAT GETS STORED IN A
for (int i = 0; i < 10; ++i)
{
printf("%c .",a[i]); // PRINTNING A WITHIN BOUND 10.
}
return 0;
}我得到的输出如下:
Enter ur Name :DESKTOP
Name : DESKTOP **//Why DESKTOP is being printed ? shouldn't be DESKTO**
D .E .S .K .T .O . . . . . 为什么我要得到桌面..。由于的大小为6,因此a必须存储了DESKTO。
发布于 2021-06-15 05:44:55
scanf()的功能不是为心脏的微弱所用。研究文档很重要;例如https://en.cppreference.com/w/c/io/fscanf。
如果您期望它最多只读一定数量的字母,这是明智的,因为您刚刚发现的明显原因(即UB、缓冲区溢出漏洞、工作原理,请参阅注释和kaylum链接),那么您需要显式地告诉它这样做。
你可以这样做
scanf("%5s",a); /* five because of the unconditional terminator... */若要仅读取到允许的大小,请使用5 +1终止符。
这是必要的,因为简单的scanf("%s",a);的意思是“鲁莽地阅读直到找到终止符;不要在意接收内存/数组的大小”。
按照建议进行更改,您的代码将获得所需的输出(少一个,否则会增加数组大小并使用6):
Enter ur Name :
Name : DESKT
D .E .S .K .T . . . . . .它仍然有来自数组之外的奇怪输出(仍然是糟糕的UB),但这是因为您的输出有10,即太长。
如果您也更改为
char a[10]={'0','1','2','3','4','5','6','7','8','9'};你得到了令人兴奋的输出
Enter ur Name :
Name : DESKT
D .E .S .K .T . .6 .7 .8 .9 .注意索引5处的不可见终止符。
或者使用scanf("%6s",a); (这对于现在更大的数组是可以的):
Enter ur Name :
Name : DESKTO
D .E .S .K .T .O . .7 .8 .9 .也就是你所期待的。
https://stackoverflow.com/questions/67980431
复制相似问题