如何在C程序中将数组中的元素设置为null

如何在C程序中将数组中的元素设置为null,c,arrays,unix,null,element,C,Arrays,Unix,Null,Element,我正在Unix中编写一个C程序,无法理解如何将数组元素设置为NULL。我需要能够这样做才能从字符串中删除多个字符。您不能将null分配给特定的字符数组索引,因为该索引表示的值是char而不是指针。但如果您需要从给定字符串中删除特定字符,则可以按如下方式实现 void removeChar(char *str, char garbage) { char *src, *dst; for (src = dst = str; *src != '\0'; src++) {

我正在Unix中编写一个C程序,无法理解如何将数组元素设置为NULL。我需要能够这样做才能从字符串中删除多个字符。

您不能将
null
分配给特定的字符数组索引,因为该索引表示的值是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;
}

如果你说的是一个指针数组(比如
char**
),你只需要说
array[element]=NULL。但是听起来好像你真的想截断一个字符串(
char*
),在这种情况下,你实际上想写
string[index]='\0'
,其中
\0
是空字节。但是,据我所知,
0
'\0'
NULL
都是等价的,等于0(如果我错了,请纠正我)。当然,为了清楚起见,您应该使用
0
表示数字,
'\0'
表示字符和字符串,而
NULL
表示指针。

如果您有
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;
}

显示一些代码。到目前为止您尝试了什么?您的意思是希望通过在某个位置添加空字符来缩短字符串吗?只需将“\0”赋给它。空字节是一个字符串终止符-如果要删除字符,需要将以下字符向左移动,而不是将“坏”字符改写为空。@adam-接受答案也很礼貌,您将来更有可能获得更多帮助。为什么这个问题上有Unix标记?
NULL
通常是
(void*)0
,这将引发“赋值从指针生成整数而不强制转换”警告。在少数平台上,
NULL
指针不是全位0,它可能会产生错误的结果。答案不错,但恐怕不一定适合这个问题。这与所问的问题毫无关系。我担心
char数组[10]
不会被初始化为一堆零。事实上,当您不初始化一个变量,而只是像这样声明它时,以前存储在内存中的值通常会被分配给它。您只是为变量保留内存,而不是“清理”它,因此内存中的内容仍然存在,它是变量的当前值。实际上,最好不要像这样初始化变量:
charstring[size]但改为如下:
charstring[size]=“”。为什么只讨论初始化?
#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 */