[英]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);
另外, scanf
和puts
不可互換,第一個讀取某些內容,第二個輸出某些內容,您可能是指gets
或更好的fgets
:
fgets(s.nome, 20, stdin);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.