繁体   English   中英

Printf char []缓冲区溢出

[英]Printf char[] buffer overflow

我遇到了这个问题,我的名字是char [20],如果我插入某个字符,该数组将溢出并写入另一个数组(cognome)。

我试图用puts()来更改scanf(),但是最后一个将无法正常工作,因为它会跳出输入并且什么也没读。


有人知道解决方案吗?

这是代码

void addStudent(){
    struct student s;
    printf("Inserire Nome: ");
    scanf("%20s",s.nome);
    printf("\nInserire Cognome: ");
    scanf("%30s",s.cognome);
    printf("\nInserire eta': ");
    scanf("%d",&s.anni);
}

结果

Inserire Nome: cjhsdjkhbsdkhfgsdjkhfgskjhgjkhsfs

Inserire Cognome: 
Inserire eta': 

更改为"%19s" 它必须比数组大小小1,因为scanf()写一个空终止符。 调用scanf()您需要跳过任何未处理的输入,这可以通过阅读直到下一个新行字符来实现:

int ch;
while ((ch = getchar()) != EOF && ch != '\n');

如果离开一个字符,则应为空字节保留一个字符,这同样适用于s.cognome

scanf("%19s",s.nome);

另外, scanfputs不可互换,第一个读取某些内容,第二个输出某些内容,您可能是指gets或更好的fgets

fgets(s.nome, 20, stdin);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM