2011-05-15 27 views
0

我想從標準輸入中讀取字符串並將其輸出到控制檯上。我用這種方式:C從標準錯誤讀取字符串

char* cmdline; 

do{ 
    scanf("%s\n", &cmdline); 
    printf("%s\n", cmdline); 
}while(cmdline != "quit"); 

但是這不起作用。我有這個錯誤Segmentation fault (core dumped)

+1

也檢查'cmdline'中的'null',除非序列總是以'quit'結尾。 – 2011-05-15 13:41:00

回答

4
char* cmdline 

是一個指針。您沒有分配空間來存儲字符串。 你應該這樣做:

cmdline = malloc(size_of_string); 

爲分配動態內存來存儲字符串。 否則,使用字符,而不是一個指針數組:

char cmdline[size_of_string]; 
+0

當'cmdline'等於quit時,如何停止迭代循環 – 2011-05-15 13:27:42

+1

@n_yanev,strcmp(cmdline,「quit」)== 0. – AProgrammer 2011-05-15 13:29:44

+1

@AProgrammer:correction:'strcmp(cmdline,「quit」)!= 0' – phoxis 2011-05-15 13:42:03

3

您已經定義char *cmdline但未分配的cmdline指針

cmdline = malloc (sizeof (char) * n); 

第一

調整字符串長度n根據您的需要。

EDIT1: 在你的版本,當您使用cmdline沒有分配它,那麼實際上cmdline包含可以是任何東西,並使用了內存訪問訪問某些內存區域,你不知道嘗試一個值,和在有內存保護的操作系統(現在的所有操作系統)中不允許使用。因此,當您將存儲在cmdline中時,它將進入無效位置,這是不允許的,操作系統將針對非法內存訪問發出分段錯誤。

malloc呼叫中分配了操作系統(堆)的內存後,cmdline將包含一個值,該值將具有由操作系統爲您的代碼發出的內存位置地址,併爲您保留,其中您有權寫入。所以用變量引用該位置會產生正確的內存引用,並且您可以像平常一樣使用它。另外請注意,如果您嘗試超出分配的內存塊,即訪問超出n位置(如果分配了n字節),那麼您還可以獲得段錯誤,因爲超出該限制的內存位置未被註冊/分配給您。儘管在這種情況下你可能不會出現段錯誤,但在這樣的位置寫作可能是沒有前途的。

用於試圖闡述這一點的唯一原因是,這是一個非常普遍的弊端以限定char *和不分配它用它的代碼,因爲舊的Turbo C++ 3.1不抱怨,這是用來通過LOT的人在那裏。然後他們打電話給我,告訴GCC編譯器壞了,因爲代碼沒有運行,並且在TC++ 3.1中運行良好。

EDIT2: 或者簡單地用靜態數組

char cmdline[MAX_SIZE]; 

其中MAX_SIZE設置根據自己的需要

EDIT3:OMG

你已經做了cmdline != "quit"這不會有任何效果。解決方案是

while (strcmp (cmdline, "quit") != 0); 

在您的代碼中。這將匹配cmdline字符串字符與靜態字符串「退出」

您的解決方案將永遠不會工作,因爲當你做cmdline != "quit"時,只是兩個地址進行比較。首先,cmdline代表您用malloc調用分配的地址,第二個是位於可執行文件的數據部分內的字符串「quit」的地址,或者簡單地位於加載程序的內存中的某個區域,不知道。比較這兩個值將不會比較這些地址的內容,即不會比較其中的字符串。

EDIT4: 另外scanf ("%s", &cmdline);不正確,因爲cmdline本身表示您想要存儲字符串的位置的地址。正確的代碼是:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main (void) 
{ 
    char *cmdline; 
    cmdline = malloc (sizeof (char) * 128);  /* or whatever size */ 
    do 
    { 
     scanf ("%s", cmdline); 
     printf ("%s\n", cmdline); 
    } 
    while (strcmp (cmdline, "quit") != 0); 
    return 0; 
} 
3

cmdline只是一個指針 - 你需要它實際上使用malloc或固定大小的數組分配空間。

3
char cmdline[80]; 

do { 
    scanf("%79s\n", cmdline); 
    printf("%s\n", cmdline); 
} while(strcmp(cmdline, "quit")); 

我看到三個錯誤與您的代碼:

的輸入緩衝區
  1. 不分配內存
  2. 沒有傳遞一個緩衝區SCANF
  3. 不使用的strcmp比較字符串