[英]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.