簡體   English   中英

解析 C 字符串並使用字符串中的值設置變量

[英]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 指針
  • 所有存儲字符串的 val 都是 calloc'd 並且所有存儲 int 的 val 都初始化為 0

在上面的示例中, val1val2返回正確的結果。 但是,由於val3點上沒有值,因此從val3開始的以下 val 被設置為不正確的結果。

有沒有辦法設置val3沒有值(或跳過插槽)並繼續val4val5

假設val3是一個 int 值,我想要的結果是:

val1 = 10101101
val2 = "Water Level"
val3 = 0
val4 = 15
val5 = "Collision"

我真的很感激任何可能的幫助。

您想將字符串拆分為固定數量的標記。 您希望允許空令牌,並且您希望進一步處理令牌。

標准標記 function, strtok將分隔符的連續延伸視為單個分隔符,它還將生成NULL標記來表示字符串的結尾。

正如在 C 中經常出現的那樣,您可以推出自己的 function。 讓我們寫一個:

  • 在單個分隔符標記處分隔字符串;
  • 使標記指針指向原始字符串,如strtok
  • 通過用 null 終止符覆蓋分隔符來“銷毀”字符串;
  • 將所有令牌存儲在一個固定大小的數組中;
  • 到達末尾后存儲空字符串,以便保證數組的所有元素都不為空,以便進一步處理。

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';
        
    }
}

筆記:

  • function 修改str ,因此您不能傳入字符串文字。 (為了安全起見,您可以先將數據strcpy到緩沖區。)
  • function 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.

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