簡體   English   中英

C編程語言(scanf)

[英]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]; ,則&stringVariableNamechar (*)[x]; ,而不是char * 類型錯誤。 該行為是不確定的。 也許巧合的工作,但任何依賴巧合不通過我的定義工作

使用&stringVariableName形成char *的唯一方法是,如果stringVariableNamechar 這意味着字符數組僅足夠大以接受終止的空字符。 如果用戶在按Enter鍵之前輸入一個或多個字符,則scanf將超出字符數組的末尾寫入並調用未定義的行為。 如果用戶僅按Enter鍵,則%[...]指令將失敗,甚至不會將'\\0'寫入字符數組


現在,一切都說完了,我將假設您的意思是: scanf("%[^\\n]", stringVariableName); 注意省略的“&”號

您確實應該檢查返回值!!

%[指令使scanf檢索由在[方括號]之間指定的字符組成的字符序列。 集合開頭的^表示所需集合包含除方括號之間的字符以外的所有字符。 因此, %[^\\n]告訴scanf讀取盡可能多的非'\\n'字符,並將它們存儲到相應char *指向的數組中。

'\\n'將不被讀取。 這可能會引起問題。 空字段將導致匹配失敗。 在這種情況下,有可能沒有數據將被復制到您的數組中(甚至沒有終止的'\\0'字符)。 由於這個原因(以及其他原因), 您確實需要檢查返回值

哪本手冊包含有關scanf返回值的信息? scanf手冊

從手冊頁中讀取scanf() ...

[匹配指定接受字符集中的非空字符序列; 下一個指針必須是指向char的指針,並且字符串中的所有字符必須有足夠的空間,再加上一個終止的空字節。 通常的前導空白跳過被抑制。 字符串由(或不在)特定集合中的字符組成; 該集合由左方括號[字符和右方括號]字符之間的字符定義。 如果開括號后的第一個字符是抑音符(^),則該字符集將排除這些字符。 要在集合中包括右括號,請將其放在開括號或抑揚符之后的第一個字符; 任何其他位置將結束該集合。 連字符-也很特殊; 當放置在其他兩個字符之間時,它將所有中間字符添加到集合中。 要包含連字符,請使其成為最后一個方括號之前的最后一個字符。 例如,[^] 0-9-]表示集合“除右括號,零至九和連字符以外的所有內容”。 字符串的結尾是未設置(或帶有抑揚符號,輸入)字符或字段寬度用盡的字符。

簡而言之,[^ \\ n]表示從不是\\n的字符串中讀取所有內容,並將其存儲在參數列表的匹配指針中。

其他人已經解釋了%[^\\n]含義。

不是讀取字符串的好方法。 這是一樣危險,出了名的不安全gets ,出於同樣的原因:它不知道在緩沖區有多大stringVariableName是。

從文件中讀取一個完整行的最佳方法是getline ,但並非所有C庫都擁有它。 如果不這樣做,則應使用fgets ,它知道緩沖區的大小,並且請注意,您可能無法獲得完整的行(如果該行對於緩沖區而言太長)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM