2013-10-02 39 views
0

該程序只需要一個帶有ASCII行的文件,將其放入鏈接列表堆棧,然後將反轉列表打印到新的文件採用相同的ASCII格式。學習C,並獲得錯誤(我認爲主要是語法,但我正在學習!)

我的結構代碼:

typedef struct Node{ 
char *info[15]; 
struct Node *ptr; 
}; 

,我發現了以下錯誤:

Errors: 
    strrev.c:14: warning: useless storage class specifier in empty declaration 
    strrev.c: In function ‘main’: 
    strrev.c:28: error: ‘Node’ undeclared (first use in this function) 
    strrev.c:28: error: (Each undeclared identifier is reported only once 
    strrev.c:28: error: for each function it appears in.) 
    strrev.c:28: error: ‘head’ undeclared (first use in this function) 
    strrev.c:34: warning: passing argument 1 of ‘strcpy’ from incompatible pointer type 

/usr/include/string.h:128:注意:預期「的char * 限制 '但是論點的類型是'char **'

我的主程序:

int main(int argc, char *argv[]) 
{ 
if (argc != 3) { 
    fprintf(stderr, "usage: intrev <input file> <output file>\n"); 
    exit(1); 
    } 

FILE *fp = fopen(argv[1], "r"); 
    assert(fp != NULL); 


Node *head = malloc(sizeof(Node)); 
head->ptr=NULL; 

char str[15]; 
while (fgets(str, 15, fp) != NULL){ 
    struct Node *currNode = malloc(sizeof(Node)); 
    strcpy(currNode->info, str); 
    currNode->ptr = head; 
    head=currNode; 
} 

char *outfile = argv[2]; 
FILE *outfilestr = fopen(outfile, "w"); 
assert(fp != NULL); 

while (head->ptr != NULL){ 
    fprintf(outfilestr, "%s\n", head->info); 
    head = head->ptr; 
} 

fclose(fp); 
fclose(outfilestr); 
return 0; 
} 
+0

我認爲很多這些錯誤必須與我的結構,但我不知道我在那裏做錯了什麼... – katiea

+0

提示:專注於第一個錯誤,張貼您的整個代碼在一塊,並非常清楚地告訴我們哪條線有第一個錯誤。 –

+1

既然你還在學習:強烈建議不要使用typedefs,除非你確實需要它們。 Typedefs可能會爲您節省一些鍵入,但生成的代碼更難以閱讀和理解。 – wildplasser

回答

5

到你的結構中引用你的結構的正確方法:

struct Node { 
    char info[15]; 
    struct Node *ptr; 
}; 

當你做你才能用它來typeout struct Node一個結構。如果你想避免,你可以做一個typedef

typedef struct Node { 
    char info[15]; 
    struct Node *ptr; 
} Node; 

然後定義變量時,你可以只使用Node,這樣

Node myNode; 

(但它可能是最好避免使用相同的名稱結構和typedef以避免混淆)。

但是請注意,當您引用自身時,您仍然必須在您的結構中編寫struct Node,因爲此時typedef尚未創建。

+0

好的 - 那絕對是我錯過的東西。謝謝!這減少了我的錯誤。 但是什麼strrev.c:16:錯誤:聲明說明符中的兩個或多個數據類型是什麼意思?該錯誤仍在發生。 – katiea

+0

@katiea你必須用分號終止你的結構定義 –

+0

我認爲這是一個C++的東西..? 更好的問題:所以我完成了我的理解,結構定義之後的分號有什麼意義。 – katiea

0

如果沒有對C進行任何類型定義,那麼C中的結構類型名稱必須以struct關鍵字開頭。因此,而不是

Node *ptr;

使用

struct Node *ptr;

你strcpy函數似乎未申報。對於那只是:#include <string.h>