我有一个从文件中读取的字符串数组。 在某些时候我需要取出一个元素,在*之前和之后添加*并将它放回到同一个数组中。
到目前为止,我已设法在strcat
的末尾添加一个星号。它正确地打印出来。
现在,我该如何在开头添加一个?
//malloc for the array has been done when read from file
char **array;
int arraySize;
for (i=0;i<arraySize;i++){
if (some_condition){
//Add * chars
array[i]=strcat(array[i],"*");
printf("Element %s was marked",array[i]);
}
//prints for example *foo*
}
很抱歉,如果问题完全是愚蠢的,答案可能很明显。感谢您提前获得任何可能的答案!
UPD :数组malloc函数
void readd(FILE *file){
size=0; /*local size */
char line[BUFSIZ]; /* Local array for a single word read */
while ((fgets(line,sizeof(line),file))!=NULL){
/* trim newline char */
if (line[strlen(line)-1]=='\n')
line[strlen(line)-1] = '\0';
array=(char**)realloc(array,(size+1)*sizeof(char *));
array[size++]=strdup(line);
}
}
答案 0 :(得分:2)
如果原始array[i]
元素有足够的空间容纳其他字符:
int len = strlen(array[i]);
memmove(array[i] + 1, array[i], len); // memmove() allows overlap btwn src & dest
array[i][0] = '*';
array[i][len+2] = '\0';
array[i][len+1] = '*'
修改:由于您已更新了问题,我将更新我的回答。 : - )
首先,请注意使用realloc()
这样的危险:
array=(char**)realloc(array,(size+1)*sizeof(char *));
如果realloc()
失败,则array
将重新分配给NULL
并且原始指针将丢失,孤立已分配给它的内存。这更安全:
char **tmp = realloc(array,(size+1)*sizeof(char *));
if (tmp == NULL) {
// Out of memory error
}
array = tmp;
当然,如果你经常这样做,你也可以跟踪当前的大小,并一次为另外一百或几千个元素分配空间。
由于单个字符串分配有strdup()
,因此您有两种选择:
为每个字符分配额外的2个字符,以防您需要添加星号。除非有数百万字符串,或系统受内存限制,否则这并非不合理。
使用上面的代码段之类的代码,在添加星号之前重新分配每个字符串。
答案 1 :(得分:1)
最简单的方法是做一个双重strcat。
但是,你有没有想过这种事情的内存管理?你的字符串是如何保存在内存中的?
在此行中,您将丢失指向原始字符串的指针:
array[i]=strcat(array[i],"*");
你有另一个对原始指针的引用吗?也许你想先保存它,然后用相同的长度+2个字符重新分配,然后放第一个*,复制字符串,放最后一个*并删除原始指针。
答案 2 :(得分:1)
您可以将array[i]
中的每个字符向右复制(向更高的索引)从后面开始并向开头复制,然后将第一个字符替换为“*”。
这假设你有足够的空间来容纳两颗额外的星星。
如果没有,您有两个选择
malloc
一个足够大的区域然后从索引1开始复制字符串并将星星放在适当的位置(索引0和索引strlen(array[i])+1
。不要忘记重新分配指针之后array[i]
到malloc'd区域。