2

我有这个问题,我的名字是 char[20],如果我插入一些字符,数组就会溢出并写入另一个数组(认知)。

我试图用 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': 
4

2 回答 2

6

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

int ch;
while ((ch = getchar()) != EOF && ch != '\n');
于 2012-11-13T17:30:52.147 回答
0

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

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

此外,scanf并且puts不可互换,第一个读取某些内容,第二个输出某些内容,您可能的意思gets或更好fgets

fgets(s.nome, 20, stdin);
于 2012-11-13T17:35:33.353 回答