[英]Parsing a C string and setting variables with values from the string
這篇文章可能被標記為重復,但我確實在網上搜索了這個特定案例,但我找不到任何類似的例子。
如何使用sscanf()
解析字符串並將所有字段存儲在各種變量中,其中一些字段為空?
以下是我的代碼的簡化版本:
// assume all vals are initialized with the correct type and memories allocated correctly
sscanf(data, "%d,%[^,],%[^,],%d,%[^,]", val1, val2, val3, val4, val5);
筆記:
data
是指向字符串"10101101,Water Level,,15,Collision"
的 char 指針 在上面的示例中, val1
和val2
返回正確的結果。 但是,由於val3
點上沒有值,因此從val3
開始的以下 val 被設置為不正確的結果。
有沒有辦法設置val3
沒有值(或跳過插槽)並繼續val4
和val5
?
假設val3
是一個 int 值,我想要的結果是:
val1 = 10101101
val2 = "Water Level"
val3 = 0
val4 = 15
val5 = "Collision"
我真的很感激任何可能的幫助。
您想將字符串拆分為固定數量的標記。 您希望允許空令牌,並且您希望進一步處理令牌。
標准標記 function, strtok
將分隔符的連續延伸視為單個分隔符,它還將生成NULL
標記來表示字符串的結尾。
正如在 C 中經常出現的那樣,您可以推出自己的 function。 讓我們寫一個:
strtok
;function 可能如下所示:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void split(char *str, const char *sep, const char *res[], size_t n)
{
for (size_t i = 0; i < n; i++) {
size_t len = strcspn(str, sep);
res[i] = str;
str += len;
if (*str) *str++ = '\0';
}
}
筆記:
str
,因此您不能傳入字符串文字。 (為了安全起見,您可以先將數據strcpy
到緩沖區。)strcspn(s, c)
計算s
中的字符數, c
中任何字符的第一次出現或字符串末尾為止。這是 function 的測試:
int main(void)
{
char data[80] = "10101101,Water Level,,15,Collision";
size_t n = 5;
const char *token[n];
split(data, ",", token, n);
for (size_t i = 0; i < n; i++) {
printf("[%zu] \"%s\"\n", i, token[i]);
}
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.