首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串格式说明程序输出整个字符串,即使char数组大小有限

字符串格式说明程序输出整个字符串,即使char数组大小有限
EN

Stack Overflow用户
提问于 2021-06-15 05:22:34
回答 1查看 36关注 0票数 1

以下是守则:

代码语言:javascript
复制
#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;
}

我得到的输出如下:

代码语言:javascript
复制
Enter ur Name :DESKTOP                      

Name : DESKTOP                    **//Why DESKTOP is being printed ? shouldn't be DESKTO**
D .E .S .K .T .O . . . . .                                                   

为什么我要得到桌面..。由于大小为6,因此a必须存储了DESKTO。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-15 05:44:55

scanf()的功能不是为心脏的微弱所用。研究文档很重要;例如https://en.cppreference.com/w/c/io/fscanf

如果您期望它最多只读一定数量的字母,这是明智的,因为您刚刚发现的明显原因(即UB、缓冲区溢出漏洞、工作原理,请参阅注释和kaylum链接),那么您需要显式地告诉它这样做。

你可以这样做

代码语言:javascript
复制
scanf("%5s",a); /* five because of the unconditional terminator... */

若要仅读取到允许的大小,请使用5 +1终止符。

这是必要的,因为简单的scanf("%s",a);的意思是“鲁莽地阅读直到找到终止符;不要在意接收内存/数组的大小”。

按照建议进行更改,您的代码将获得所需的输出(少一个,否则会增加数组大小并使用6):

代码语言:javascript
复制
Enter ur Name :
Name : DESKT
D .E .S .K .T . . . . . .

它仍然有来自数组之外的奇怪输出(仍然是糟糕的UB),但这是因为您的输出有10,即太长。

如果您也更改为

代码语言:javascript
复制
char a[10]={'0','1','2','3','4','5','6','7','8','9'};

你得到了令人兴奋的输出

代码语言:javascript
复制
Enter ur Name :
Name : DESKT
D .E .S .K .T . .6 .7 .8 .9 .

注意索引5处的不可见终止符。

或者使用scanf("%6s",a); (这对于现在更大的数组是可以的):

代码语言:javascript
复制
Enter ur Name :
Name : DESKTO
D .E .S .K .T .O . .7 .8 .9 .

也就是你所期待的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67980431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档