2011-01-27 89 views
2

如果在使用char數組之前需要聲明char數組,那麼如何聲明一個char數組以便可以用來存儲輸入?在C中處理字符串輸入

例如用戶輸入一個句子或一系列單詞。這是如何存儲的,以便它可以被操縱?

什麼是正確的方法,而不是隻聲明一個足夠大的數組來處理預期的輸入?

回答

6

如果你正在談論控制檯輸入,你別無選擇,只能有一個固定大小的緩衝區和使用安全功能不允許超過FIXED_SIZE存儲在你的緩衝區。

一個例子是:

char buff[1024]; 
fgets(buff, 1024, stdin); // to read from standard input 

你必須提醒你的用戶是超出1023th任何字符將被忽略。

如果你想輸入的用戶訪問最後一個字符:

printf("%c", buff[strlen(buff)-1]); 
+0

謝謝。如何訪問角色呢?如果buff是1024和e。g用戶輸入一個由10個字符組成的字符串,如果我想訪問最後一個字符,是否需要遍歷數組來查找轉義字符?如果我使用了指針?例如char *字;然後將字設置爲來自scanf的輸入。我將如何訪問角色? – jarryd 2011-01-27 11:48:41

1

通過緩衝輸入? (用戶寫入的文字來緩衝一些大小,當緩衝區已滿,PROGRAMM改變使用realloc的目標數組的大小)

(你需要使用的char *代替的char [])

2

我通常使用以下功能:

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

#define OK  0 
#define NO_INPUT 1 
#define TOO_LONG 2 
static int getLine (char *prmpt, char *buff, size_t sz) { 
    int ch, extra; 

    // Get line with buffer overrun protection. 
    if (prmpt != NULL) { 
     printf ("%s", prmpt); 
     fflush (stdout); 
    } 
    if (fgets (buff, sz, stdin) == NULL) 
     return NO_INPUT; 

    // If it was too long, there'll be no newline. In that case, we flush 
    // to end of line so that excess doesn't affect the next call. 
    if (buff[strlen(buff)-1] != '\n') { 
     extra = 0; 
     while (((ch = getchar()) != '\n') && (ch != EOF)) 
      extra = 1; 
     return (extra == 1) ? TOO_LONG : OK; 
    } 

    // Otherwise remove newline and give string back to caller. 
    buff[strlen(buff)-1] = '\0'; 
    return OK; 
} 

它使用緩衝區溢出安全fgets一些支持代碼搞清楚,如果你進入了線太長。

你當然可以閱讀部分行並執行內存重新分配來存儲任意大小的輸入字符串,但通常只需設置足夠大的上限並允許(例如1K)就足夠了。如果有人輸入比他們的名字或地址更多的東西,他們可能只是愚蠢的:-)

我已經使用過這個技巧(部分讀取和reallocs)做用戶輸入之前,但老實說,對它的需求非常罕見,所以它沒有成爲我的「重要的源代碼片段」存儲庫。

使用fgets可以防止緩衝區溢出的可能性,這是對用戶輸入的危險。


如果你想測試代碼,嘗試添加:

int main (void) { 
    int rc; 
    char buff[10]; 

    rc = getLine ("Enter string> ", buff, sizeof(buff)); 
    if (rc == NO_INPUT) { 
     printf ("No input\n"); 
     return 1; 
    } 

    if (rc == TOO_LONG) { 
     printf ("Input too long\n"); 
     return 1; 
    } 

    printf ("OK [%s]\n", buff); 

    return 0; 
} 

和一些樣品運行:

pax> ./qq 
Enter string> hi bob 
OK [hi bob] 

pax> ./qq 
Enter string> 
No input 

pax> ./qq 
Enter string> hi ho the merry oh 
Input too long 

(即第二個是進入CTRLd,文件的直接結束)。