首先,我是C新手,但沒有編程;我在PHP中做了很多web開發。對於這個問題...C - sprintf()影響數組聲明
我有一個讀取一系列二進制文件並輸出內容的函數,但是使用sprintf()
正在影響後續多維數組的內存分配。請看下圖:
FILE *fp;
for(int i = 1; i <= 16; i++) {
char format_1[] = "track_%d.bin";
char filename_1[sizeof format_1+100];
sprintf(filename_1,format_1,i);
printf("Filename: %s \n", filename_1);
fp = fopen(filename_1, "rb");
if(fp) {
fseek(fp, 0L, SEEK_END);
int sz = (ftell(fp)/3) - 1;
fseek(fp, 0L, SEEK_SET);
printf("File size: %d\n", sz);
int nums[sz][3];
fread(nums,sizeof(int),sz * 3, fp);
for (int k = 0; k < sz; k++) {
printf("Entry number %d = %d with extra values of %d and %d\n", k, nums[k][0], nums[k][1], nums[k][2]);
}
} else {
printf("Skipping \n");
}
fclose(fp);
}
我知道這是sprintf的()引起的問題,因爲我簡化了功能:
printf("Please enter file number... \n");
scanf("%d%c", &num_file, &term);
printf("Please enter how many instances in this file... \n");
scanf("%d%c", &num_instance, &term);
int nums[num_instance][3];
char format_1[] = "track_%d.bin";
char filename_1[sizeof format_1+3];
sprintf(filename_1,format_1,num_file);
printf("Filename: %s \n", filename_1);
fp = fopen(filename_1, "rb");
fread(nums,sizeof(int),num_instance * 3, fp);
fclose(fp);
for (int k = 0; k < num_notes; k++) {
printf("Entry number %d = %d with extra values of %d and %d\n", k, nums[k][0], nums[k][1], nums[k][2]);
}
當我移動的sprintf以上(NUMS的聲明),它工作正常(即使它只是在它上面),只要我移動下面的sprintf NUMS的聲明()輸出看起來象下面這樣:
Entry number: 0 = 71 with extra values 116 and 158
Entry number: 1 = -1073743712 with extra values -1073744240 and -1073744304
Entry number: 2 = -1073743896 with extra values 59983 and -1073744005
正如你可以從上面的代碼片段看,我需要有declarat nums
以下的sprintf()
,因爲我需要知道文件中的條目數量。
編輯:我想如果我提到一個文件包含多維數組可能會有所幫助:array[x][3]
。
真的難住這個,任何幫助,非常感謝。
@FredrikPihl C99有VLA。 – 2013-04-03 21:17:55
@FredrikPihl'sizeof format_1 + 3'是一個編譯時間常量。 – 2013-04-03 21:20:59
您需要檢查C中的返回值。這樣您可以準確找到代碼失敗的位置。 – 2013-04-03 21:21:48