字符串格式说明符输出整个字符串,即使 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 .

即如您所愿。