2013-09-28 67 views
0

我無法弄清楚如何保存用戶輸入字符串。字符串,詢問並存儲

我想問用戶兩個單獨的字符串變量(一個字),並將它們存儲以備後用,用作referencequery變量。我想過使用scanf來獲取用戶輸入,並使用%s來存儲變量。

我要麼得到分段錯誤或錯誤的輸出取決於我如何修改代碼。我究竟做錯了什麼?

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

int main(void) 
{ 

    char *reference, *query; 

    printf("\n Enter reference genome file name: "); 
    scanf("%s", reference); 

    printf("\n Enter sequence query file name: "); 
    scanf("%s", query); 

    printf("\n\n Reference file used was: %s\n", reference); 
    printf("Query sequence file used was: %s\n", query); 

    return 0; 
} 

回答

2

取代具有char*你應該char[](字符數組)分配的。

聲明你的字符串是這樣的:

char reference[80]; 
char query[80]; 

這樣,計算機知道多少空間來保存的字符串。這就是爲什麼你之前得到了分段錯誤的原因,因爲你有一個指向字符串開頭的指針,但沒有內存來存儲它。

我改變了代碼:

#include <stdio.h> 

int main() { 
    char reference[80]; 
    char query[80]; 

    printf("\nEnter reference genome file name: "); 
    scanf("%s", reference); 

    printf("\nEnter sequence query file name: "); 
    scanf("%s", query); 

    printf("\nReference file used was: %s\n" 
      "Query sequence file used was: %s\n", reference, query); 

    return 0; 
} 

gcc編譯和運行示例:

Enter reference genome file name: file1.txt 

Enter sequence query file name: file2.txt 

Reference file used was: file1.txt 
Query sequence file used was: file2.txt 
+0

當我這樣做時,我得到不正確的解析,意思是它爲參考文件打印的名稱與查詢文件名混合在一起。此外,我得到分段錯誤: – bretonics

+0

謝謝!使用gcc編譯時,你也會得到這個警告嗎? 'warning:format指定類型'char *',但參數的類型爲'char **'[-Wformat] scanf(「%s」,引用);' – bretonics

+0

I我無法用'-Wall'或'-Wformat'來獲得警告。我使用的是舊版本4.2.1。 –

2

這裏:

char *reference, *query; 

您還沒有分配給任何存儲字符串。你可以這樣來做:

char reference[100], query[100]; 

這是假設你在前進的最大輸入尺寸知道,你將需要採取額外的步驟,以確保你不告訴scanf的溢出緩衝區,如最大尺寸:

scanf("%99s", reference); 

您可以檢查返回值以查看用戶是否輸入了太多內容,以便知道它是否被截斷。

+0

如果我不知道輸入大小怎麼辦? – bretonics

+0

好吧,這似乎工作,但如何編譯引用和查詢變量時得到一個警告:'警告:格式指定類型'char *',但參數具有類型'char **'[-Wformat] scanf (「%s」,參考);' – bretonics

+0

約翰:請不要回答明顯的重複,請投票結束。 – 2013-09-28 05:06:57