printf char []缓冲区溢出

时间:2012-11-13 17:29:43

标签: c printf

我有这个问题,我的nome是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': 

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

你关闭一个字符,你应该为空字节留一个字符,同样适用于s.cognome

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

此外,scanfputs不可互换,第一个读取内容,第二个输出内容,您可能意味着gets或更好fgets

fgets(s.nome, 20, stdin);