Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将NULL赋值到c字符串的中间_C_String_Null Terminated - Fatal编程技术网

将NULL赋值到c字符串的中间

将NULL赋值到c字符串的中间,c,string,null-terminated,C,String,Null Terminated,我正在编写一个函数eliminate(char*str,int character),它将一个c字符串和一个要消除的字符作为输入,扫描str以查找character的实例,并将当前索引中的值替换为。。。什么?我认为NULL,但这似乎有风险,可能会干扰其他依赖c字符串中NULL终止符的函数。例如: char *eliminate(char *str, int character) { if (!str) return str; int index = 0; while (

我正在编写一个函数
eliminate(char*str,int character)
,它将一个c字符串和一个要消除的字符作为输入,扫描
str
以查找
character
的实例,并将当前索引中的值替换为。。。什么?我认为
NULL
,但这似乎有风险,可能会干扰其他依赖c字符串中NULL终止符的函数。例如:

char *eliminate(char *str, int character) {
    if (!str) return str;

    int index = 0;
    while (str[index])
       if (str[index] == character)
          str[index++] = '\0'; //THIS LINE IS IN QUESTION
    return str;
}

我的问题是,如何正确地实现这个函数,以便有效地消除字符串中指定字符的所有实例?如果适当的消去法将
'\0'
分配给要替换的字符,这如何不影响整个字符串(即,它实际上在遇到的第一个
'\0'
处结束)。例如,如果我在同一个字符串上运行上述函数两次,那么第二个调用将只检查字符串,直到最后一个字符被替换为止

如果你知道自己在做什么,使用这种替代品是可以的

只有当字符缓冲区
char*str
可写时(例如通过
malloc
动态分配,或仅通过堆栈上的字符数组
char-str[SIZE]
),它才能工作。它不能用于字符串文本

标准函数strtok也以这种方式工作。顺便说一句,如果您希望使用以null结尾的子字符串,您可能可以在任务中使用
strtok



字符函数参数使用整数类型是没有意义的:
int character
->
char character

将字符替换为“\0”可能会导致混淆。我将通过将下一个符合条件的字符转移到其位置来消除不受欢迎的字符

char *eliminate(char *str, int character) {
    if (!str) return str;

    int index = 0, shiftIndex = 0;
    while (str[index]) {
       if (str[index] == character) 
          index++;
       else {
          str[shiftIndex] = str[index];
          shiftIndex++, index++;
       }
    }
    str[shiftIndex] = '\0';
    return str;
}

你可能想重新考虑这个循环。。。似乎它将永远运行…
NULL
不是字符,永远不会用作整数值。大多数编译器定义它
(void*)0
。启用编译器警告并注意它们!选择一种语言。你忘了陈述你的实际目标。嘿,这可能是一个重复,但并不总是可靠的,因为OP没有存储更多的上下文,他实际上把终结者放在了哪里。这取决于未显示的上下文。@Olaf什么不可靠?OP希望用“\0”替换某些字符。这个问题是在以null结尾的C字符串的上下文中提出的。因此,我假设作者希望使用某个分隔符标记以null结尾的子字符串。当然,它会更改原始缓冲区,因此缓冲区不能像使用
strtok
时那样用于初始字符串。请查看
strtok
以及为什么它不是线程安全的。然后你可能会看到区别。@Olaf我知道strtok的工作原理,我也知道strtok的工作原理。这就是为什么我在第一行中写道,只有“如果你知道你在做什么”才能完成。如果调用者能够正确释放初始字符串,构建这样的子字符串是非常安全的。“如果你知道你在做什么”在这里太矛盾了。尤其是OP显然是个初学者。