在C语言中替换字符串中的字符

3

我有一个字符串格式的字符数组,格式为<item1>:<item2>:<item3>,最好的方法是如何将其拆分,以便可以单独打印不同的项目?我应该只是循环遍历数组,还是有一些字符串函数可以帮助?


2
你会从阅读任何一本初学者C语言书籍中受益的,甚至可以阅读K&R(《The C Programming Language》)这本书。 - Alex Brown
请查看sscanf()strtok(),如果您自己实现也不难。 - Jack
4个回答

1
我会使用sscanf函数。
char * str = "i1:i2:i3";
char a[10];
char b[10];
char c[10];
sscanf(str, "%s:%s:%s", a, b, c);

这不安全,因为它容易受到缓冲区溢出的攻击。在Windows中,有sscanf_s作为一种安全措施。


1
你可以尝试使用strtok函数: 以下是一些示例代码,用于获取由逗号、破折号或竖线分隔的子字符串。
#include <stdio.h>
#include <string.h>
int main(int argc,char **argv)
{
char  buf1[64]={'a', 'a', 'a', ',' , ',', 'b', 'b', 'b', '-', 'c','e', '|', 'a','b', };
/* Establish string and get the first token: */
char* token = strtok( buf1, ",-|");
while( token != NULL )
    {
/* While there are tokens in "string" */
        printf( "%s ", token );
/* Get next token: */
        token = strtok( NULL, ",-|");
    }
return 0;
}

1
-1,使用从字符串字面量初始化的字符指针运行strtok()是一个非常不好的想法。这个字面量是只读的,但是strtok()会修改它。这很容易导致崩溃。 - unwind
谢谢您的建议。我只是快速地写了这个示例,没有考虑到这个问题。谢谢。 - wbao

0

strtok 是最好的选择,这里想要补充两点:

1)strtok 修改/操作了您的原始字符串并将其剥离出分隔符,

2)如果您有一个多线程程序,最好使用 strtok_r,它是线程安全/可重入版本。


0

只需遍历字符串,每次遇到':'时,打印自上一个':'出现以来读取的内容。

#define DELIM ':'


char *start, *end;

start = end = buf1;

while (*end) {
    switch (*end) {
        case DELIM:
            *end = '\0';
            puts(start);
            start = end+1;
            *end = DELIM;
            break;
        case '\0':
            puts(start);
            goto cleanup;
            break;
    }
    end++;
}

cleanup:
// ...and get rid of gotos ;)

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