我在Unix编写一个C程序,无法弄清楚如何将数组元素设置为NULL。我需要能够从字符串中删除多个字符。
答案 0 :(得分:7)
您不能将null
分配给特定的char数组索引,因为该索引所代表的值是char而不是指针。但是如果你需要从给定字符串中删除特定字符,可以按如下方式实现:
void removeChar(char *str, char garbage) {
char *src, *dst;
for (src = dst = str; *src != '\0'; src++) {
*dst = *src;
if (*dst != garbage) dst++;
}
*dst = '\0';
}
测试计划
#include<stdio.h>
int main(void) {
char* str = malloc(strlen("abcdef")+1);
strcpy(str, "abcdbbbef");
removeChar(str, 'b');
printf("%s", str);
free(str);
return 0;
}
输出
acdef
答案 1 :(得分:2)
如果您有char[]
,则可以使用以下方法清零单个元素:
char arr[10] = "foo";
arr[1] = '\0';
请注意,这与分配NULL
不同,因为arr[1]
是char
而不是指针,您无法为其分配NULL
。
那就是说,这可能不会做你想象的那样。上面的示例将生成字符串f
,而不是您期望的fo
。
如果要从字符串中删除字符,则必须使用memmove
和一些指针算法将字符串的内容向左移动(包括空终止符):
示例:
#include <stdio.h>
#include <string.h>
int removechars(char *str, size_t pos, size_t cnt) {
size_t len = strlen(str);
if (pos + cnt > len)
return -1;
memmove(str + pos, str + pos + cnt, len - pos - cnt + 1);
return 0;
}
然后像这样使用它:
char str[12] = "hello world";
if (removechars(str, 5, 4) == 0) /* remove 4 chars starting at str[5] */
printf("%s\n", str); /* hellold */
答案 2 :(得分:0)
如果你在谈论一系列指针(比如char **
),你只需说array[element] = NULL;
。但听起来好像你真的想截断一个字符串(char *
),在这种情况下你实际上想要写string[index] = '\0'
,其中\0
是空字节。但是,据我所知,0
,'\0'
和NULL
都是等效的,等于0(如果我错了,请纠正我)。当然,为清楚起见,您应该使用0
表示数字,'\0'
表示字符和字符串,NULL
表示指针。