我是C語言編程的新手,我正在撰寫這個程式,以讀入一個檔案并列印出一個自動對齊的表格。一切都運行得很好,但我收到Valgrind的警告,說條件性跳轉或移動取決于未初始化的值。我還需要能夠傳入任何.txt檔案,而不僅僅是一個特定的.txt檔案。我知道我可以使用argv,但不知道如何在一個函式中使用它而不是在main中呼叫它。
代碼:
#include <stdio.h>/span>
#include <string.h>
#include <stdlib.h>
//常數,用于存盤可從檔案中讀取的最大記錄大小。
enum
{
///更新MAX_SIZE到如果行數超過1000。
MAX_SIZE=1024
};
//從檔案中存盤一條記錄的結構。
typedef struct
{[/span>
char define[20] 。
char octal[26] 。
char description[1000] 。
} 記錄。
//string to store the header of the table[/span
char header1[20], header2[20], header3[20] 。
//函式用于讀取檔案并回傳從檔案中讀取的最大描述長度。
void readFile(Record rec[], int *size, int *length, int *length1, int *length2)
{
int i = 0;
int maxLength,maxLength1,maxLength2=0;
//打開一個檔案進行輸入。
FILE *fp = fopen("input2.txt", "r") 。
//檢查檔案是否成功打開。
if (fp == NULL)
{
printf("File could not be opened!") 。
exit(1)。
}
//讀取檔案。
//首先我們從檔案中讀取每一列的標題。
fscanf(fp, "%s%s%s
", header1, header2, header3)。)
//現在我們從檔案中讀取每個記錄。
while (fscanf(fp, " s", rec[i].define) == 1)
{
fscanf(fp, " s '%[^']'", rec[i].octal, rec[i].description) 。
//找到描述的長度并更新'maxLength'。
if(strlen(rec[i].description) > maxLength)
{
maxLength = strlen(rec[i].description)。
}
else if(strlen(rec[i].octal) > maxLength1)
{
maxLength1 = strlen(rec[i].octal)。
}
else if(strlen(rec[i].define) > maxLength2)
{
maxLength2 = strlen(rec[i].define)。
}
//增加i的值。
i ;
}
printf(" Length: %d
", maxLength)。)
//關閉輸入檔案。
fclose(fp)。
//更新從檔案中讀取的記錄數 //更新從檔案中讀取的記錄數
*size = i;
*length = maxLength;
*length1 = maxLength1;
*length2 = maxLength2;
}
void printTable(Record rec[], int size, int length, int length1, int length2)
{
if(length2 >= 15)
{
for (int i = 0; i < length length1 length2 17; i )
printf("-"/span>)。
printf("
| %-*s | %*s | %-*s |
", length2,header1, length1, header2, length, header3)。)
for (int i = 0; i < length length1 length2 17; i )
printf("-"/span>)。
printf("
")。)
//列印表的資料。
for (int i = 0; i < size; i )
printf("| %-*s | s | %-*s |")
",length2, rec[i].define, rec[i].octal, length, rec[i].description)。)
//列印頁腳。
for (int i = 0; i < length length1 length2 17; i )
printf("-"/span>)。
printf("
")。)
}
else; }
{
printf("length: %d
", length2)。)
//列印表格的標題。
for (int i = 0; i < length length1 length2 10; i )
printf("-"/span>)。
printf("
| %-*s | %*s | %-*s |
", length2,header1, length1, header2, length, header3)。)
for (int i = 0; i < length length1 length2 10; i )
printf("-"/span>)。
printf("
")。)
//列印表的資料。
for (int i = 0; i < size; i )
printf("|%-*s | %*s | %-*s | %-*s |
",length2, rec[i].define, length1, rec[i].octal, length, rec[i].description)。)
//列印頁腳。
for (int i = 0; i < length length1 length2 10; i )
printf("-"/span>)。
printf("
")。)
}
}
//驅動函式; }
int main()
{
//創建一個MAX_SIZE的recors陣列。
記錄recs[MAX_SIZE]。
//將recs的大小初始化為零。
int size = 0;
int length=0;
int length1=0;
int length2=0;
//呼叫readFile()函式,從檔案中讀取資料并更新recs的大小。
readFile(recs, &size,&length,&length1,&length2)。
//呼叫printTable()函式,以良好的格式化方式列印表格。
printTable(recs, size, length,length1,length2)。
return 0。
Valgrind警告:
==1821== Memcheck, a memory error detector
==1821== Copyright (C) 20022017, and GNU GPL'd, by Julian Seward et al.
==1821==使用Valgrind-3.13.0和LibVEX;用-h重新運行以獲得著作權資訊
==1821==命令。./main input2.txt
==1821==
==1821==有條件的跳轉或移動取決于未初始化的值(s)。
==1821==在0x10896F處: readFile (main.c:50)
==1821==在0x108E17處: main (main.c:147)
==1821==
==1821==有條件的跳轉或移動取決于未初始化的值(s)
==1821==在0x1089C2: readFile (main.c:54)
==1821==在0x108E17處: main (main.c:147)
uj5u.com熱心網友回復:
int maxLength,maxLength1,maxLength2=0;沒有初始化maxLength或maxLength1。
uj5u.com熱心網友回復:
它試圖告訴你,maxLength和maxLength1是未初始化的變數。
你有這樣一行宣告:
int maxLength,maxLength1,maxLength2=0;
但是在該陳述句中只有maxLength2被初始化為0。其他兩個變數的值是未定義的。
因此,當代碼到了第50行或第54行時,進行這樣的比較:
if(strlen(rec[i].description) > maxLength){
不確定的是maxLength應該是什么。
uj5u.com熱心網友回復:
不要使用這樣的宣告:
int maxLength,maxLength1,maxLength2=0;
這很危險,而且難以閱讀,因為maxLength和maxLength1將不會被初始化為0。
取而代之的是在單獨的一行中宣告每個變數,這樣做的可讀性要高得多:
int maxLength = 0;
int maxLength1 = 0;
int maxLength2 = 0;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/310456.html
標籤:
上一篇:安卓11存盤訪問和Java檔案庫
