2010-12-13 25 views
2

我很难解决这个问题。我有一个C字符串,我想删除它的第一部分。让我们说它:“食物,金额,卡路里”。我想复制每一个这些值,但不是逗号。我找到了逗号,并将逗号的位置返回给我的方法。然后我用删除C字符串的第一部分

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

要“theLine”复制到我的阵列在位置“I”,仅在第一个“结束”字符(首次,“结束”将是4,是因为那里的第一个逗号是)。但是,因为它在循环中,我想从数组中删除“食物”,并重新执行该过程。但是,我看不到我如何删除第一部分(或向前移动数组指针?)并保留其余部分。任何帮助将是有用的!

回答

2

你需要的是砍掉串用逗号作为您的分隔符。

你需要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的尝试写入只读字符串常量崩溃。 – 2010-12-13 05:24:11

+0

是。该代码仅用于演示目的与使用strtok有关。 :-) – 2010-12-13 05:28:21

+0

@ChrisDodd:仓促upvoted你的评论(没有撤消),但不同意。将常量字符串'* s'复制到cstring'str'中,每次调用strtok都会修改cstring(用'0'终止符替换',')并返回该令牌的地址。所以在那里没有不变的只读字符串。我错了吗? – Salvador 2014-04-19 23:07:26

0

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

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

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

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

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可能是一个更好的主意。

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