2012-05-24 36 views
0

我是C的新手,並且遇到了一個K & R C(1.9節)示例工作不正常的問題。下面是我從例如複製,匆匆的代碼在一次尋找差異:K&R C的分段錯誤舉例1.9

#include <stdio.h> 
#define MAXLINE 1000 

int mygetline(char line[], int maxline); 
void copy(char to[], char from[]); 

// print longest input line 

main() { 
    int len; 
    int max; 
    char line[MAXLINE]; 
    char longest[MAXLINE]; 

    max = 0; 
    while ((len = mygetline(line, MAXLINE)) > 0) 
     if (len > max) { 
      max = len; 
      copy(longest, line); 
     } 
    if (max > 0) // there was a line 
     printf("%s", longest); 
    return 0; 
} 

// getline: read a line into s, return length 
int mygetline(char s[], int lim) { 
    int c, i; 

    for (i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) 
     s[i] = c; 
    if (c == '\n') { 
     s[i] = c; 
     ++i; 
    } 
    s[i] = '\0'; 
    return i; 
} 

// copy: copy 'from' onto 'to'; assume to is big enough 
void copy(char to[], char from[]) { 
    int i; 

    i = 0; 
    while ((to[i] = from[i]) != "\0") 
     ++i; 
} 

我編譯時得到如下:

cc -Wall -g test.c -o test 
test.c:9:1: warning: return type defaults to ‘int’ [-Wreturn-type] 
test.c: In function ‘copy’: 
test.c:45:30: warning: comparison between pointer and integer [enabled by default] 
test.c:45:30: warning: comparison with string literal results in unspecified behavior [-Waddress] 

當我運行程序,出現這種情況:

Ĵ

[email protected]:~/c$ ./test 
Hello, does this work? 
Segmentation fault (core dumped) 

我使用gcc作爲我的編譯器。

+1

你可能想得到一本本世紀的書.. –

+5

K&R是舊的,但它是一個經典的,仍然非常值得一讀。 – duskwuff

回答

1

問題在於以下行:

while ((to[i] = from[i]) != "\0") 

應該

while ((to[i] = from[i]) != '\0') 

現在,至於爲什麼第一個是錯誤的。 「\ 0」實際上是一個存儲在某個存儲器中的字符串文本(例如,地址是0x7d5678),而!=的左邊是一個整數。編譯器會自動知道,這樣的比較是錯誤的,永遠無法通過,所以它給你的警告

warning: comparison between pointer and integer [enabled by default] 

此外,當你有一個字符串在代碼中的文字,你無法控制的,以在什麼地址將它保存,所以編譯器再一次知道有一個字符串進行任何比較是錯誤的,因此標誌警告

warning: comparison between pointer and integer [enabled by default] 

此外,作爲附加的註釋,永遠記住,在C字符串可以比較&操作僅使用strcmp或strncmp組的字符串函數。你永遠不能對字符串進行「=」比較。 希望這有助於理解。

+0

謝謝,這給了我很多額外的信息。 – talloaktrees

7

更改"\0"'\0'在複製功能。 「\ 0」是一個字符串,你想要一個字符。

+2

另請注意,編譯器針對此錯誤發出警告 - 帶回家信息:始終閱讀並根據編譯器警告採取行動! –

+0

謝謝。我來自Python,單引號和雙引號大多可以互換。 – talloaktrees

+0

Paul R:我讀了編譯器的消息,但沒有幫助,因爲我不明白單引號和雙引號之間的區別,以及爲什麼它不應該是字符串。 – talloaktrees

2

您的copy函數有一個錯字"\0"而不是'\0'(正如編譯器警告所暗示的那樣)。條件是不太可能發生