我正在嘗試閱讀有關scanf()在 for 回圈中使用的學生的資訊(N時間 - >N由用戶輸入),但for()回圈不止于此……它根本沒有停止。我已經嘗試了字串格式的所有組合,但似乎沒有任何效果。
這是我的代碼:
#include <stdio.h>
#include <string.h>
typedef struct STUDENT_CONSTRUCTOR {
char first_name[35], last_name[35];
char gender;
int grade;
} student;
int main(void) {
int N; // number of entries
student list[N];
printf("Number of entries: "); scanf("%d", &N);
for (int i = 0; i<N; i ) {
printf("<Entry %d>\n", i);
scanf("%d %c %s %s\n", &list[i].grade, &list[i].gender, list[i].first_name, list[i].last_name);
}
return 0;
}
我想輸入如下序列:
10 M Mateas Mario其中“10”是平均成績,“M”是性別,“Mario”是我的名字,“Mateas”是我的姓氏。
N被正確讀取,并且list[]陣列內的資料也被正確讀取。
list[]基于包含所有這些資料型別的結構。
盡管如此,每當我輸入特定值N(例如 3、4、5 等)時,<Entry ...>總是超出該數字。在告訴我scanf()已棄用之前,我想知道是否有可能在不洗掉該scanf()功能的情況下修復此代碼。我不想使用,fgets()因為我不知道輸入包含的最大字符數。
任何幫助,將不勝感激。謝謝你。
uj5u.com熱心網友回復:
這里 ...
int N; // number of entries student list[N];
...您正在使用 的不確定初始值N來指定 的維度list。未定義的行為結果。該 UB 不限于表現為立即失敗或嘈雜的失敗。在這種特殊情況下,它表現為您的迭代沒有在您期望的地方停止。
盡管對 UB 的特定表現形式的機制進行推理通常不是很有成效,但它似乎通常會激發某種反常的好奇心,因此我推測在您的情況下,list所提供的元素比您最終要求的要少,甚至可能為 0,因此,您的輸入超出了其界限,導致 的值N意外更改。
通過N 在的宣告之前輸入來修復它list,或者僅通過宣告list足夠大的固定數量的元素來容納 的每個可接受的值來修復它N。
uj5u.com熱心網友回復:
您在可變長度陣列的宣告中使用了未初始化的變數 N
int N; // number of entries
student list[N];
所以程式有未定義的行為。
相反,你需要寫
int N; // number of entries
printf("Number of entries: "); scanf("%d", &N);
student list[N];
同樣在從格式字串中scanf洗掉換行符的呼叫中'\n'
scanf("%d %c %s %s", &list[i].grade, &list[i].gender, list[i].first_name, list[i].last_name);
scanf您可以使用函式來代替函式scanf_s。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/338860.html
