我有一个程序,用另一个数组的内容替换char数组的一部分,但是它也替换了不应替换的部分。
下面的代码是负责替换数组中字符的代码。
一次只能输入一个字符,但是当仅应替换的字符的一部分位于xy
的{{1}}之类的数组中时,应将其保留,并寻找下一次出现的xyz
然后将其替换。
xyz
我的问题是,如果只存在程序要搜索和替换的部分,即使它不是完整的词,它也会替换它。
例如:
如果我想将i =0;
while(i < 30){
j=0;
while(j < k){
if(carray[i] == aarray[j])
carray[i] = barray[j];
j++;
}
i++;
}
数组中的xyz
替换为abc
那么数组具有以下内容:
xyzdefxyzghixy
aarray[] = {xyz}
barray[] = {abc}
我得到carray[] = {xyzdefxyzghixy}
作为输出,最后两个字符abcdefabcghiab
实际上应保留为ab
即
我希望输出为xy
我在这里做错了什么。
注意:请注意,我只想使用abcdefabcghixy
非常感谢所有帮助。
谢谢。
答案 0 :(得分:1)
仅在找到完整的子字符串时才需要替换。
有一些有用的标准功能:
提案:
#include <stdio.h>
#include <string.h>
int main(int argc, char ** argv)
{
if (argc != 4)
printf("usage : %s <str> <old> <new>\n", *argv);
else {
char * old = argv[2];
char * new = argv[3];
size_t len = strlen(old);
if (len != strlen(new))
fprintf(stderr, "'%s' and '%s' do not have the same length\n", old, new);
else {
char * str = argv[1];
char * p = str;
printf("'%s' -> ", str);
/* the loop doing the replacements */
while ((p = strstr(p, old)) != NULL) {
memcpy(p, new, len);
p += len;
}
printf("'%s'\n", str);
}
}
return 0;
}
编译和执行:
pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall r.c
pi@raspberrypi:/tmp $ ./a.out
usage : ./a.out <str> <old> <new>
pi@raspberrypi:/tmp $ ./a.out xyzdefxyzghixy xyz abc
'xyzdefxyzghixy' -> 'abcdefabcghixy'
修改
注意:请注意,我只想使用stdio.h
可以是:
#include <stdio.h>
int main(int argc, char ** argv)
{
if (argc != 4)
printf("usage : %s <str> <old> <new>\n", *argv);
else {
char * old = argv[2];
char * new = argv[3];
char * str = argv[1];
/* check old and new have the same length */
char * pold, * pnew;
for (pold = old, pnew = new; *pold && *pnew; ++pold, ++pnew)
;
if (*pold || *pnew)
fprintf(stderr, "'%s' and '%s' do not have the same length\n", old, new);
else {
printf("'%s' -> ", str);
char * pstr = str;
/* the loop doing the replacements */
while (*pstr) {
/* check if substring */
char * pold = old;
char * psubstr = pstr;
while (*pold && (*pold == *psubstr)) {
pold += 1;
psubstr += 1;
}
if (*pold == 0) {
/* substring, replacement */
pnew = new;
while (*pnew)
*pstr++ = *pnew++;
}
else
pstr += 1;
}
printf("'%s'\n", str);
}
}
return 0;
}
如您所见,这是一个错误的选择,很容易理解以前版本的功能,而不是那个版本