我有一个填充了一些字符的char数组。假设我的char数组中有“HelloWorld”。 (不是字符串。占用索引0到9)
我要做的是在数组的中间插入一个字符,然后将其余部分推到一边,为正在插入的新字符腾出空间。
所以,我可以使char数组中包含“Hello.World”。
char ch[15]; // assume it has "HelloWorld" in it
for(int i=0; i<=strlen(ch)-1; i++) {
if(ch[i]=='o' && ch[i+1]=='W') {
for(int j=strlen(ch)-1; j>=i+2; j--) {
ch[j] = ch[j-1]; // pushing process?
}
ch[i+1] = '.';
break;
}
}
这会有用吗?会有更简单的方法吗?我可能只是觉得这太复杂了。
答案 0 :(得分:3)
您需要从strlen(ch) + 1
开始内循环,而不是strlen(ch) - 1
,因为您还需要将NULL终结符移动到正确的位置。请记住,strlen
会返回字符串的长度,以便string[strlen(string)] == '\0'
;您可以将strlen
视为获取C字符串的NULL终止符索引的函数。
答案 1 :(得分:2)
如果您想将所有字符向上移动一个,则可以使用memmove
来完成。
#include <string.h>
char ch[15];
int make_room_at = 5;
int room_to_make = 1;
memmove(
ch + make_room_at + room_to_make,
ch + make_room_at,
15 - (make_room_at + room_to_make)
);
答案 2 :(得分:1)
简单地说:
#define SHIFT 1
char bla[32] = "HelloWorld"; // We reserve enough room for this example
char *ptr = bla + 5; // pointer to "World"
memmove(ptr + SHIFT, ptr, strlen(ptr) + 1); // +1 for the trailing null
答案 3 :(得分:1)
内循环的初始起始值是一个短。它应该类似于以下内容。另请注意,由于字符向右移动,因此需要添加新的null终止符:
ch[strlen(ch) + 1] = '\0';
for(j=strlen(ch); j>=i+2; j--) { // note no "-1" after the strlen
编辑至于“这是一个好方法吗?”部分,我认为这是合理的;它只取决于预期的目的。想到几个想法:
答案 4 :(得分:0)
如果您要操作char数组,则不应将其设为静态。通过这样做:
char ch[15];
你正在硬编码数组,总是有15个字符。将它作为指针将是第1步:
char* ch;
这样您可以根据需要进行修改。