2014-04-06 55 views
-1

我閱讀的Objective-C的BigNerdRanch書,它的運行通過我如何把線到stdin經常C.出於某種原因,這就是所謂的示例代碼與readline複製運行輸入(小錯誤)不起作用。它成功地構建但考慮在其中輸入後,如果我輸入Mikey它顯示MMiikkeeyyÇ的Readline功能不工作

我得到:

(lldb) IMPLICIT DECLARATION OF FUNCTION READLINE IS Thread1:EXC_BAD_ACCESS(code=1,address=0x20000) 

代碼:

#include <stdio.h> 

int main(int argc, const char * argv[]) 
{ 
    printf("Who is cool? "); 
    const char *name = readline(NULL); 
    printf("%s is cool!\n\n", name); 
    return 0; 
} 

任何幫助深表感謝。

+1

這可能意味着'readline()'沒有在''中聲明。您需要導入適當的庫。 –

回答

1

你不包括其中readline()聲明的頭文件。因此, 編譯器假定函數返回int。這是在運行時 發生崩潰的原因。

如果使用GNU readline庫再加入

#include <readline/readline.h> 
#include <readline/history.h> 

你的代碼。但是從你的問題來看,我認爲你正在使用OS X上的Xcode編譯。 OS X有一個「libedit」庫,它有一個「readline wrapper」。在這種情況下,你只 包括

#include <editline/readline.h> 

重複的輸入(MMiikkeeyy)可能是調試器控制檯的問題。 如果從命令行啓動程序,它應該可以正常工作。

+0

需要包含額外的頭文件才能使它工作!具體來說:#include steviejay

0
#include <stdio.h> 

int main(int argc, const char * argv[]) 
{ 
    printf("Who is cool? "); 
    char name[50]; 
    scanf("%s",name); 
    printf("%s is cool!\n\n", name); 
    return 0; 
} 

上面的代碼做你的願望。

有兩個問題與您的代碼

  1. 沒有名爲readline的功能。從標準輸入中讀取 個字符的函數稱爲scanf。函數需要2 參數的格式如%s,這意味着您要讀取一個字符串 和您想要存儲字符的變量。
  2. 您的變量定義也存在問題。你已經做了 聲明它爲名稱後面帶有[size]的數組,所以你可以存儲 多個字符。

希望這有助於和好的C資源看here

+0

'const char * name [50];'是錯誤的。你需要'char name [50];' – nos

+0

感謝沒有注意到我剛剛複製了op的代碼編輯 –

0

對我來說編譯到inclue readline時,該include的還不夠:

#include <stdio.h> 
#include <readline/readline.h> 
#include <readline/history.h> 

我不得不鏈接到readline

gcc readline_prog.c -o readline_prog -g -Wall -Wextra -lreadline 

如前所述here一些可能需要提供編譯器的其他路徑也在。