[英]C programming language (scanf)
我已經使用以下scanf()
語句讀取了帶有空格的字符串。
scanf("%[^\n]", &stringVariableName);
控制字符串[^\\n]
是什么意思?
可以這樣讀取帶有空格的字符串嗎?
這意味着“閱讀任何內容,直到找到'\\ n'”
可以,但是這樣做更好:“讀取任何內容,直到找到'\\ n',或者讀取比我的緩沖區支持更多的字符”
char stringVariableName[256] = {}
if (scanf("%255[^\n]", stringVariableName) == 1)
...
編輯:從參數中刪除&,然后檢查scanf的結果。
格式說明符"%[^\\n]"
指示scanf()
讀取最多但不包括換行符。 從鏈接的參考頁面:
matches a non-empty sequence of character from set of characters. If the first character of the set is ^, then all characters not in the set are matched. If the set begins with ] or ^] then the ] character is also included into the set.
如果字符串在一行上,則可以使用fgets()
,但是必須將新行刪除,因為fgets()
會將其寫入輸出緩沖區。 fgets()
還強制程序員指定可以讀入緩沖區的最大字符數,從而使緩沖區溢出的可能性較小:
char buffer[1024];
if (fgets(buffer, 1024, stdin))
{
/* Remove newline. */
char* nl = strrchr(buffer, '\n');
if (nl) *nl = '\0';
}
可以指定通過scanf()
讀取的最大字符數:
scanf("%1023[^\n]", buffer);
但是不可能忘記為fgets()
做它,因為編譯器會抱怨。 當然,盡管程序員可能會指定錯誤的大小,但至少他們被迫考慮使用錯誤的大小。
從技術上講,這不能很好地定義。
匹配一組預期字符(掃描集)中的非空字符序列。
如果不存在長度修飾符,則相應的參數應為指向字符數組初始元素的指針,該元素的大小應足以接受該序列和一個終止的空字符,該字符將自動添加。
假設stringVariableName
的聲明類似於char stringVariableName[x];
,則&stringVariableName
為char (*)[x];
,而不是char *
。 類型錯誤。 該行為是不確定的。 也許巧合的工作,但任何依賴巧合不通過我的定義工作 。
使用&stringVariableName
形成char *
的唯一方法是,如果stringVariableName
是char ! 這意味着字符數組僅足夠大以接受終止的空字符。 如果用戶在按Enter鍵之前輸入一個或多個字符,則scanf將超出字符數組的末尾寫入並調用未定義的行為。 如果用戶僅按Enter鍵,則%[...]
指令將失敗,甚至不會將'\\0'
寫入字符數組 。
現在,一切都說完了,我將假設您的意思是: scanf("%[^\\n]", stringVariableName);
( 注意省略的“&”號 )
您確實應該檢查返回值!!
%[
指令使scanf檢索由在[
方括號]
之間指定的字符組成的字符序列。 集合開頭的^
表示所需集合包含除方括號之間的字符以外的所有字符。 因此, %[^\\n]
告訴scanf讀取盡可能多的非'\\n'
字符,並將它們存儲到相應char *
指向的數組中。
'\\n'
將不被讀取。 這可能會引起問題。 空字段將導致匹配失敗。 在這種情況下,有可能沒有數據將被復制到您的數組中(甚至沒有終止的'\\0'
字符)。 由於這個原因(以及其他原因), 您確實需要檢查返回值 !
哪本手冊包含有關scanf返回值的信息? scanf手冊 。
從手冊頁中讀取scanf()
...
[匹配指定接受字符集中的非空字符序列; 下一個指針必須是指向char的指針,並且字符串中的所有字符必須有足夠的空間,再加上一個終止的空字節。 通常的前導空白跳過被抑制。 字符串由(或不在)特定集合中的字符組成; 該集合由左方括號[字符和右方括號]字符之間的字符定義。 如果開括號后的第一個字符是抑音符(^),則該字符集將排除這些字符。 要在集合中包括右括號,請將其放在開括號或抑揚符之后的第一個字符; 任何其他位置將結束該集合。 連字符-也很特殊; 當放置在其他兩個字符之間時,它將所有中間字符添加到集合中。 要包含連字符,請使其成為最后一個方括號之前的最后一個字符。 例如,[^] 0-9-]表示集合“除右括號,零至九和連字符以外的所有內容”。 字符串的結尾是未設置(或帶有抑揚符號,輸入)字符或字段寬度用盡的字符。
簡而言之,[^ \\ n]表示從不是\\n
的字符串中讀取所有內容,並將其存儲在參數列表的匹配指針中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.