删除 C 字符串的第一个部分

3

我在解决这个问题时遇到了很多困难。我有一个C字符串,想要删除它的前面部分。假设它是:"食物,数量,卡路里"。我想要复制出每一个值,但不包括逗号。我找到逗号,并将其位置返回给我的方法。然后我使用

strncpy(aLine.field[i], theLine, end);

我想将“theLine”复制到我的数组中的位置“i”,只使用前面的“end”个字符(第一次,“end”为4,因为那是第一个逗号的位置)。但是,由于它在循环中,我想从数组中删除“Food,”并重新执行该过程。但是,我不知道如何删除第一部分(或将数组指针向前移动?)并保留其余部分。任何帮助都将有用!

5个回答

3

您需要做的是使用逗号作为分隔符来截取字符串。

您可以使用strtok来完成这个任务。以下是一个示例代码:

int main (int argc, const char * argv[]) {


    char *s = "asdf,1234,qwer";
    char str[15];
    strcpy(str, s);
    printf("\nstr: %s", str);
    char *tok = strtok(str, ",");
    printf("\ntok: %s", tok);
    tok = strtok(NULL, ",");
    printf("\ntok: %s", tok);
    tok = strtok(NULL, ",");
    printf("\ntok: %s", tok);

    return 0;
}

这将会给你以下输出结果:
str: asdf,1234,qwer
tok: asdf
tok: 1234
tok: qwer

1
事实上,在大多数机器上,当strtok尝试写入只读字符串常量时,程序会崩溃。 - Chris Dodd
是的。那段代码仅用于演示使用strtok的目的。 :-) - Neilvert Noval
@ChrisDodd:匆忙地点赞了你的评论(无法撤销),但我不同意。常量字符串 *s 被复制到 cstring str 中,每次调用 strtok 都会修改 cstring(将 , 替换为 '0' 终止符)并返回令牌的地址。因此,在那里没有常量只读字符串被重写。我错了吗? - Salvador
@Salvador: 你没错 - 这个注释是针对修改前的原始代码(作为回应)添加副本之前的。 - Chris Dodd

2
如果你需要保留原始字符串,那么可以使用strtok函数。如果不需要保留,可以将每个分隔符替换为'\0',然后直接使用得到的字符串。
char s_RO[] = "abc,123,xxxx", *s = s_RO;
while (s){
    char* old_str = s;
    s = strchr(s, ',');
    if (s){
        *s = '\0';
        s++;
    };
    printf("found string %s\n", old_str);
};

0
如果你知道逗号的位置,就可以从那个点继续读取字符串。
例如:
void readTheString(const char *theLine)
{
    const char *wordStart = theLine;
    const char *wordEnd = theLine;

    int i = 0;
    while (*wordStart) // while we haven't reached the null termination character
    {
        while (*wordEnd != ',')
            wordEnd++;
        // ... copy the substring ranging from wordStart to wordEnd
        wordStart = ++wordEnd; // start the next word
    }
}

或者类似的东西。
空终止检查可能是错误的,除非字符串也以','结尾...但你明白我的意思。

无论如何,使用strtok可能是一个更好的选择。


0

0

个人而言,我会使用strtok()。

我不建议从字符串中删除提取的标记。删除字符串的一部分需要复制剩余的字符,这不是很高效。

相反,您应该跟踪您的位置,并将您想要的部分仅复制到新字符串中。

但是,再次强调,我会使用strtok()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接