首页 > 解决方案 > C在字符之间更改字符串

问题描述

假设我有一个字符串“hello_from_here”。我想更改“_”之间的子字符串,例如“hello_21223_here”。

我想我应该使用strtok,但到目前为止我还没有成功。

到目前为止,我正在尝试做:

char input[] = "this_is_name";
char* first_part = strtok(input, "_");
char* second_part = strtok(strtok(input, "_"), "_");
char output[64];
int pos = 44;
snprintf(output,sizeof(output),"%s%06d%s", first_part, pos, second_part);

我知道这snprintf是正确的,但我失败了strtok

输出是:

this000044this

我的目标输出是:

this000044name

标签: cstringstrtokstring.h

解决方案


这是我的尝试

#include <stdio.h>

void replacemarks(char *dst, const char *src, char c, const char *r) {
    while (1) {
        while (*src && (*src != c)) *dst++ = *src++;
        if (*src == 0) break;
        *dst++ = *src++;
        if (*src == 0) break;
        const char *cc = strchr(src + 1, c);
        if (cc) {
            const char *rr = r;
            while (*rr) *dst++ = *rr++;
            src = cc;
            *dst++ = *src++;
        } else {
            while (*src) *dst++ = *src++;
            break;
        }
    }
    *dst = 0;
}

int main(void) {
    char line[100];
    while (fgets(line, sizeof line, stdin)) {
        char src[100], c, r[100], dst[100];
        sscanf(line, "%s %c%s", src, &c, r);
        replacemarks(dst, src, c, r);
        printf("replacemarks(..., \"%s\", '%c', \"%s\") ==> \"%s\"\n",
              src, c, r, dst);
    }
    return 0;
}

https://ideone.com/LhJaaq

使用输入运行的示例

hello_from_here _ 21223
this_is_name _ 000044
阿布拉卡达布拉 r foo
*一二三* *  -  - 
*一二三四* *  -  - 
*一二三四 *  -  - 
一二三四* *  -  - 
*一二三四五* *  -  - 
*一二三四五 *  -  - 
一二三四五* *  -  - 

输出(针对堆栈溢出进行了美化):

替换标记(...,“hello_from_here”,“_”,“21223”)==>“hello_21223_here”
替换标记(...,“this_is_name”,“_”,“000044”)==>“this_000044_name”
replacemarks(..., "abracadabra", 'r', "foo") ==> "abrfoora"
replacemarks(..., "*one*two*three*", '*', "----") ==> "*----*two*----*"
replacemarks(..., "*one*two*three*four*", '*', "----") ==> "*----*two*----*four*"
replacemarks(..., "*one*two*three*four", '*', "----") ==> "*----*two*----*four"
replacemarks(..., "一*二*三*四*", '*', "----") ==> "一*----*三*----*"
replacemarks(..., "*一*二*三*四*五*", '*', "----") ==> "*----*二*----*四* ----*”
replacemarks(..., "*一*二*三*四*五", '*', "----") ==> "*----*二*----*四*五"
replacemarks(..., "一*二*三*四*五*", '*', "----") ==> "一*----*三*----*五* "

推荐阅读