字符串格式说明符输出整个字符串,即使 char 数组大小有限
String Format Specifier outputs whole String even though char array size is limited
代码如下:
#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 . . . . .
为什么我得到 DESKTOP .. 因为 a 大小是 6 因此 a 必须存储 DESKTO .
函数scanf()
不适合胆小的人使用。研究文档很重要;例如https://en.cppreference.com/w/c/io/fscanf .
如果您希望它最多只读取一定数量的字母,这是明智的,因为您刚刚发现的显而易见的原因(即 UB、缓冲区溢出漏洞、作品,请参阅评论和 link by kaylum),那么你需要明确地告诉它这样做。
你可以这样做
scanf("%5s",a); /* five because of the unconditional terminator... */
只读到允许的大小,5 +1 终止符。
这是必须的,因为简单的scanf("%s",a);
意思是“胡乱读,直到找到终止符;不用管接收的大小memory/array”。
已按提议更改,您的代码获得了所需的输出(少一个,否则增加数组大小并使用 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 .
即如您所愿。
代码如下:
#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 . . . . .
为什么我得到 DESKTOP .. 因为 a 大小是 6 因此 a 必须存储 DESKTO .
函数scanf()
不适合胆小的人使用。研究文档很重要;例如https://en.cppreference.com/w/c/io/fscanf .
如果您希望它最多只读取一定数量的字母,这是明智的,因为您刚刚发现的显而易见的原因(即 UB、缓冲区溢出漏洞、作品,请参阅评论和 link by kaylum),那么你需要明确地告诉它这样做。
你可以这样做
scanf("%5s",a); /* five because of the unconditional terminator... */
只读到允许的大小,5 +1 终止符。
这是必须的,因为简单的scanf("%s",a);
意思是“胡乱读,直到找到终止符;不用管接收的大小memory/array”。
已按提议更改,您的代码获得了所需的输出(少一个,否则增加数组大小并使用 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 .
即如您所愿。