我正在尝试用多个字符替换字符串中的某个字符。这是我想要做的一个例子。
说我有字符串“aaabaa”
我想用5“c”替换所有出现的字符“b”。
所以当我完成后,“aaabaa”变成了“aaacccccaa”
我写了以下代码:
#include <stdio.h>
#include <string.h>
int main(void)
{
char s[20] = "aaabaa";
int i, j;
for (i=0; s[i]!= '\0'; i++)
{
if (s[i] == 'b')
{
for (j=0; j<5; j++)
{
s[i+j] = 'c';
}
}
}
printf("%s\n", s);
}
此功能的输出是“aaaccccc”。它似乎只是用c来覆盖最后两个a。有没有什么方法可以让这些最后几个不被覆盖?
答案 0 :(得分:10)
如果您想要一般性地执行此操作,而不必担心尝试调整缓冲区的大小,则应malloc
一个足够大的新字符串来保存结果:
/* return a new string with every instance of ch replaced by repl */
char *replace(const char *s, char ch, const char *repl) {
int count = 0;
const char *t;
for(t=s; *t; t++)
count += (*t == ch);
size_t rlen = strlen(repl);
char *res = malloc(strlen(s) + (rlen-1)*count + 1);
char *ptr = res;
for(t=s; *t; t++) {
if(*t == ch) {
memcpy(ptr, repl, rlen);
ptr += rlen;
} else {
*ptr++ = *t;
}
}
*ptr = 0;
return res;
}
用法:
int main() {
char *s = replace("aaabaa", 'b', "ccccc");
printf("%s\n", s);
free(s);
return 0;
}
答案 1 :(得分:5)
您的问题是您将“ccccc”替换为原始字符串,从而在您想要替换之后覆盖剩余的字符...您应该复制到一个新字符串并跟踪两个索引 - 每个索引一个。 / p>
很高兴您声明char s[20]
大于原始字符串的大小加上替换值,否则您在关键登录系统中创建了一个缓冲区溢出漏洞: - )
干杯,
答案 2 :(得分:1)
必须声明第二个char数组。在下面的代码中,它只是在条件失败时将数组s的内容复制到s1。
#include <stdio.h>
#include <string.h>
int main(void)
{
char s[20] = "aaabaa";
char s1[1024];
int i, j, n;
for (i=0, n = 0; s[i]!= '\0'; i++)
{
if (s[i] == 'b')
{
for (j=0; j<5; j++)
{
s1[n] = 'c';
n++;
}
}
else
{
s1[n] = s[i];
n++;
}
}
s1[n] = '\0';
printf("%s\n", s1);
}
答案 3 :(得分:1)
您可以使用其他变量
#include <stdio.h>
#include <string.h>
int main(void)
{
char s[20] = "aaabaa";
char temp[20]="";
int i, j,k;
k=0;
for (i=0; s[i]!= '\0'; i++)
{
if (s[i] == 'b')
{
for (j=0; j<5; j++)
{
temp[k] = 'c';
k++;
}
}
else
{
temp[k]=s[i];
k++
}
}
printf("%s\n", temp);
}
答案 4 :(得分:1)
#include <stdio.h>
#include <string.h>
int main(void)
{
char temp[20];
char s[20] = "aaabaa";
int i, j;
for (i=0; s[i]!= '\0'; i++)
{
if (s[i] == 'b')
{
strcpy(temp,s[i+1]); //copy rest of the string in this case 'aa'
for (j=0; j<5; j++)
{
s[i+j] = 'c';
}
s[i+j] = '\0'; // here we get s = "aaaccccc"
strcat(s,temp); // concat rest of the string (temp = "aa") after job is done.
// to this point s becomes s = "aaacccccaa"
}
}
printf("%s\n", s); //s = "aaacccccaa".
}
这里我们使用缓冲区(temp)来存储我们要替换的字符后的其余字符串。 更换完成后,我们将其追加到最后。
所以我们得到s =&#34; aaacccccaa&#34;
答案 5 :(得分:0)
好吧,如果你要动态分配数组,你可能需要分配第二个数组。这是必要的,因为你的字符串只分配了固定数量的内存。
因此,我建议增加一个告诉你新数组有多大的计数器,而不是tryig来覆盖for循环中的字符。您的计数器应该以原始字符串的大小开始,并在每次找到“b”的实例时增加4。然后,您应该能够编写一个函数,将修改后的字符串适当地复制到大小为[counter]的新char缓冲区,每次找到'b'时插入5个c。
答案 6 :(得分:-1)
使用此功能:
char *replace(char *st, char *orig, char *repl) {
static char buffer[4096];
char *ch;
if (!(ch = strstr(st, orig)))
return st;
strncpy(buffer, st, ch-st);
buffer[ch-st] = 0;
sprintf(buffer+(ch-st), "%s%s", repl, ch+strlen(orig));
return buffer;
}
适合您的情况:printf("%s\n", replace(s,"b","ccccc"));