如果我有如下字符串: “龙珠很酷。”
但是我想将空格更改为多行:“ ---”
所以这将是最终结果:七龙珠-很酷-
我该怎么办?是否需要循环(我知道如何用另一个字符替换单个字符),或者有另一种方法吗?
答案 0 :(得分:5)
有几种方法可以完成。一种方法是首先对字符串进行标记,例如使用strtok
找出空格。
然后将不同的子字符串(单词)一一复制到新的字符串(字符数组)中,例如使用strcat
。对于您复制的每个字符串,还复制一个字符串"---"
。
另一种选择是仅手动执行所有操作,而无需调用任何字符串库函数。
是的,您将需要循环。
答案 1 :(得分:1)
我制作了一个示例程序,您可以检查自己是否喜欢。替换子字符串时将遇到的最大问题是,您可能需要比原始源字符串更多的空间。因此,通常您希望将修改后的源字符串写入其他位置。您可以使用strncat
和strncmp
等有用的函数来解决目标缓冲区可能小于扩展源缓冲区的情况。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_BUF_LEN 32
#define MIN(p,q) ((p) < (q) ? (p) : (q))
void replace (const char *src, char *buf, size_t buf_size, const char *pat, const char *rep) {
size_t pat_len = strlen(pat), rep_len = strlen(rep);
int inc, i = 0;
const char *p = NULL;
while (*src != '\0') {
// Here, if we detect a match, we set our copy pointer and increment size.
if (strncmp(src, pat, pat_len) == 0) {
inc = MIN(buf_size - i - 1, rep_len);
p = rep;
} else {
inc = MIN(buf_size - i - 1, 1);
p = src;
}
// If we ran out of room in the buffer, we break out of the loop here.
if (inc <= 0) break;
// Here we append the chosen buffer with the increment size. Then increment our indexes.
buf = strncat(buf, p, inc);
i += inc;
++src;
}
// Don't forget the null-character.
buf[i] = '\0';
}
int main (void) {
const char *src = "Hello World!";
const char *match = " ";
const char *repl = "...";
char buf[MAX_BUF_LEN] = {0};
replace(src, buf, MAX_BUF_LEN, match, repl);
fprintf(stdout, "The string \"%s\" has been transformed to \"%s\"\n", src, buf);
return EXIT_SUCCESS;
}