使用sscanf(以“ |”分隔)从字符串中提取(可能为空)单词

沃尔鲁兹

我想从字符串中提取单词。

我不想使用strtok因为它会破坏我的源字符串。另一件事是我想知道是否可以在不使用周期的情况下设法完成我想做的事情。

这是我的代码示例。它成功读取了第一个单词,但第二个和第三个保持空白。

char source[] = "XXX|YYY|ZZZ";

char word1[10] = "";
char word2[10] = "";
char word3[10] = "";

sscanf( source, "%[^|]s|%[^|]s|%s", word1, word2, word3 );

真的有可能这样做sscanf吗?还是我走错了路?

更新:

看来user3121023的答案不适用于空词。

char source[] = "XXX||ZZZ";

char word1[10] = "";
char word2[10] = "";
char word3[10] = "";

sscanf( source, "%[^|]|%[^|]|%s", word1, word2, word3 );

第三个字为空。在这种情况下我该怎么办?

chqrlie

您的sscanf()格式不会清空子字符串,如果目标数组小于源字符串,它也不会防止潜在的缓冲区溢出。

这是带有strcspn()和实用程序功能的解决方案strcpy_n

#include <string.h>

char *strcpy_n(char *dest, size_t size, const char *src, size_t n) {
    if (size > 0) {
        if (n >= size)
            n = size - 1;
        memcpy(dest, src, n);
        dest[n] = '\0';
    }
    return dest;
}

...

    char source[] = "XXX||ZZZ";
    char word1[10], word2[10], word3[10] = "";

    size_t pos = 0, len;

    len = strcspn(source + pos, "|");
    strcpy_n(word1, sizeof(word1), source + pos, len);
    pos = pos + len + (source[pos + len] == '|');

    len = strcspn(source + pos, "|");
    strcpy_n(word2, sizeof(word2), source + pos, len);
    pos = pos + len + (source[pos + len] == '|');

    len = strcspn(source + pos, "|");
    strcpy_n(word3, sizeof(word3), source + pos, len);
    pos = pos + len + (source[pos + len] == '|');

...

您可以将以上代码包装到另一个实用程序函数中,getfield()分解更多代码:

/* returns non zero if there are more fields to parse */
int getfield(char *dest, size_t size, const char *source, size_t *ppos) {
    int has_separator = 0;
    size_t pos = *ppos;
    size_t len = strcspn(source + pos, "|");
    strcpy_n(dest, size, source + pos, len);
    pos += len;
    has_separator = (source[pos] == '|');
    *ppos = pos + has_separator;
    return has_separator;
}

 ...

    char source[] = "XXX||ZZZ";
    char word1[10], word2[10], word3[10];

    size_t pos = 0;

    /* parse the fields, empty and missing fields are set to "" */
    getfield(word1, sizeof(word1), source, &pos);
    getfield(word2, sizeof(word2), source, &pos);
    getfield(word3, sizeof(word3), source, &pos);

...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在C ++中使用sscanf从字符串中提取一个整数

如何仅使用 sscanf 从字符串中提取所有数字?

使用Matlab的sscanf从文本字符串中提取值

使用LIKE从逗号分隔的字符串中提取ID

使用制表符分隔的正则表达式从指定的字符串中提取单词

使用grep / sed / awk从字符串中提取单词

使用sscanf读取字符串

使用sscanf分析字符串

使用sscanf解析连续字符串

使用包含字符串的sscanf解析字符串

java - 如何使用单词或字符作为提取的引用从java中的字符串(文本/ HTML)中提取单词

基于分隔符使用sscanf()读取多个字符串

使用sscanf从char字符串读取固定宽度的float

使用sscanf读取固定长度的字符串

使用sscanf检查字符串格式

使用sscanf比较字符串,但忽略空格

使用sscanf将字符串转换为时间

使用sscanf解析字符串是否好

如何使用sscanf分析字符串数据?

使用sscanf()拆分AT命令字符串

使用键模式和使用Ruby分隔符从字符串中提取子字符串

使用 C++ 从分隔符分割的字符串中提取整数数组

如何使用sed从逗号分隔的字符串中提取数字?

使用R中的几个分隔符从字符串中提取数字

使用正则表达式从逗号分隔的字符串中提取值

如何使用数字作为分隔符从文本字符串中提取值?

如何使用python在字符串(包含多个分隔符)中提取路径

Amazon QuickSight 使用计算字段从逗号分隔的未排序字符串中提取字符串

如何使用sscanf函数读取特定字符?