簡體   English   中英

C sscanf需要幫助的理解

[英]C sscanf Need help understanding

我正在嘗試學習一些CI認為是的? 我在看下面的sscanf代碼

sscanf(val1,":%[^ ] %s %s %[^\n]%*[\n\r]%n", val2 , val3 , val4 , val5 ,&n);

但是我在理解它時遇到了很多麻煩,我在網上查找了有關sscanf的信息,據我了解,val1中的char數組被分解為val2,val3,val4,val5和&n。 但是我不太明白這一點:

:%[^ ] %s %s %[^\n]%*[\n\r]%n

我假設字符串是根據%s,部分來划分的,但其余的我不太確定,我真的希望有人可以給我說一個示例字符串,以及該字符串如何變成不同的值? 謝謝!!

格式字符串的解析如下:

:%[^ ] %s %s %[^\n]%*[\n\r]%n
^  ^    ^ ^     ^   ^   ^   ^
|  |    | |     |   |   |   |
|  |    | |     |   |   |   +-- the number of characters read so far
|  |    | |     |   |   +------ \n or \r
|  |    | |     |   +---------- read and ignore this portion of the input
|  |    | |     +-------------- Read string up to \n; should be [^\n\r]
|  |    | +-------------------- Read a string
|  |    +---------------------- Read a string
|  +--------------------------- Read a string up to a space character
+------------------------------ Read a ':' character

如果存在單個空格,則表示需要使用零個或多個空格字符的序列,而不將其放置在任何輸出變量中。 例如,應用於"hello world"字符串的"%s %s"會將"hello"放入第一個字符串,將"world"放入第二個字符串,並忽略將這兩個字符串分隔開的空格。

此處使用%n格式,您可以知道此操作從輸入中消耗了多少個字符。 通常這樣做是為了調整循環中下一個讀取的位置,並確定循環是應該繼續還是終止。

注意:使用%s是不安全的,因為輸入足夠長的字符序列將導致緩沖區溢出。 在將字符串讀取到長度為N的緩沖區中時,應將N-1的大小放在%s之間。 例如,如果將字符串讀入大小為32的緩沖區中,請按如下所示更改格式字符串:

:%31[^ ] %31s %31s %31[^\n]%*[\n\r]%n

這樣可以確保當用戶輸入超過31個字符時,不會出現緩沖區溢出。 需要為空終止符保留字符32。

暫無
暫無

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

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