我想從標準輸入中讀取字符串並將其輸出到控制檯上。我用這種方式:C從標準錯誤讀取字符串
char* cmdline;
do{
scanf("%s\n", &cmdline);
printf("%s\n", cmdline);
}while(cmdline != "quit");
但是這不起作用。我有這個錯誤Segmentation fault (core dumped)
我想從標準輸入中讀取字符串並將其輸出到控制檯上。我用這種方式:C從標準錯誤讀取字符串
char* cmdline;
do{
scanf("%s\n", &cmdline);
printf("%s\n", cmdline);
}while(cmdline != "quit");
但是這不起作用。我有這個錯誤Segmentation fault (core dumped)
char* cmdline
是一個指針。您沒有分配空間來存儲字符串。 你應該這樣做:
cmdline = malloc(size_of_string);
爲分配動態內存來存儲字符串。 否則,使用字符,而不是一個指針數組:
char cmdline[size_of_string];
當'cmdline'等於quit時,如何停止迭代循環 – 2011-05-15 13:27:42
@n_yanev,strcmp(cmdline,「quit」)== 0. – AProgrammer 2011-05-15 13:29:44
@AProgrammer:correction:'strcmp(cmdline,「quit」)!= 0' – phoxis 2011-05-15 13:42:03
您已經定義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;
}
cmdline
只是一個指針 - 你需要它實際上使用malloc
或固定大小的數組分配空間。
char cmdline[80];
do {
scanf("%79s\n", cmdline);
printf("%s\n", cmdline);
} while(strcmp(cmdline, "quit"));
我看到三個錯誤與您的代碼:
的輸入緩衝區
也檢查'cmdline'中的'null',除非序列總是以'quit'結尾。 – 2011-05-15 13:41:00