[英]Why placement of declaration of variable is important?
我的代碼的主要任務是從外部文件中取出數據,然后在開頭指定一個數字。 問題是下面的代碼工作得很好。
#include <stdio.h>
int main(void) {
char name[20], surname[30], group[2];
puts("Now i download data from file");
int n = 1, number;
while (!feof(stdin)) {
scanf ("%s %s %d %s", name, surname, &number, group);
printf("%d. %s | %s | %d | %s", n, name, surname, number, group);
}
return 0;
}
但是當我改變一行的位置時,它會將n
的值設置為 0 並且不會上升。
#include <stdio.h>
int main(void) {
int n = 1, number;
char name[20], surname[30], group[2];
puts("Now I download data from file");
while (!feof(stdin)) {
scanf ("%s %s %d %s", name, surname, &number, group);
printf("%d. %s | %s | %d | %s", n, name, surname, number, group);
}
return 0;
}
您的代碼具有潛在的未定義行為:如果數據文件包含超過目標數組中可存儲的最大長度的字段, fscanf()
將導致緩沖區溢出並覆蓋內存中的其他內容,可能是另一個局部變量......更改順序局部變量定義可能會改變這個錯誤的副作用。 未定義的行為可能導致任何事情,從沒有明顯影響到程序崩潰甚至市場崩潰。
還要注意while (!feof(stdin))
總是錯誤的。
以下是您可以修改代碼以避免這種未定義行為並驗證數據文件是否正確轉換的方法:
#include <stdio.h>
int main(void) {
char buf[128];
char name[20], surname[30], group[2];
int n = 1, number;
char dummy;
puts("Now I download data from file");
while (fgets(buf, sizeof buf, stdin)) {
if (sscanf("%19s %29s %d %1s %c", name, surname, &number, group, &dummy) == 4) {
printf("%d. %s | %s | %d | %s\n", n++, name, surname, number, group);
} else {
printf("Invalid format: %s", buf);
}
}
printf("%d records\n", n);
return 0;
}
group
大於單個字符的任何記錄都會導致格式錯誤。 如果該group
可能有 2 個字符,則應將數組定義為char group[3]
並將其轉換為%2s
。 同樣的評論適用於所有字符串字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.