按索引从c中的字符串中删除字符
如何在不使用任何库的情况下从c中的字符串中删除某个字符 功能?我写的函数似乎有一个运行时错误,我不知道为什么按索引从c中的字符串中删除字符,c,string,C,String,如何在不使用任何库的情况下从c中的字符串中删除某个字符 功能?我写的函数似乎有一个运行时错误,我不知道为什么 void remove_char(char* s,int index) { while(s[index+1] != 0) { s[index] = s[index + 1]; index++; } s[index] = 0; } 我还想知道是否有一种方法可以删除复杂度为1的字符?在不了解如何调用
void remove_char(char* s,int index)
{
while(s[index+1] != 0)
{
s[index] = s[index + 1];
index++;
}
s[index] = 0;
}
我还想知道是否有一种方法可以删除复杂度为1的字符?在不了解如何调用函数的情况下,很难知道确切的故障模式。用char string[]调用它=这是一个字符串;,它工作得很好。但正如评论所指出的,一些其他形式的输入字符串可能会导致问题 我使用了以下实现,没有任何问题。它将删除指定字符的所有匹配项:
int RemoveCharFromString(char *orig, char c, char *newStr)
{
if(!orig) return -1;
if(!newStr) return -1;
int i=0, j=0;
while (*(orig+i) != '\0')
{
if (*(orig+i) != c)
{
*(newStr+j) = *(orig+i);
j++;
i++;
}
else i++;
}
*(newStr+j) = '\0';
return 0;
}
或者,根据您的请求,此操作将删除指定索引处的字符:
int RemoveCharFromStringByIndex(char *orig, int index, char *newStr)
{
if(!orig) return -1;
if(!newStr) return -1;
int i=0, j=0;
while (*(orig+i) != '\0')
{
if (i != index)
{
*(newStr+j) = *(orig+i);
j++;
i++;
}
else i++;
}
*(newStr+j) = '\0';
return 0;
}
注意,在这个实现中,newStr是由调用者创建的,并且必须包含足够的空间来包含结果
你当然可以用任何你需要的方式来适应这些。一项改进是将原型更改为:
char * RemoveCharFromString(char *orig, char c);
或
但是,如果您愿意,您可以这样做。我总是喜欢这样从字符串中删除特定字符:
int RemoveCharFromString(const char *src, char *dst, char c)
{
const char *s;
char *d;
if ((char *)0 != src && (char *)0 != dst) {
for (d = dst, s = src; (*d = *s); s++) {
if (c != *d)
d++;
}
return 0;
}
return 1;
}
仅当目标指针不等于被跳过的字符时,才递增目标指针。有时,您会直接使用传递的参数src和dst看到这一点,但早在某些编译器使用单独的指针生成更高效的代码的时候。常量只允许您传递常量字符串作为源,而不会产生编译器错误。如何使用该函数?你传递什么参数,它们的值是什么?你能不能试着创建一个演示给我们看?您已经尝试过了吗?不能从复杂度为O1的字符串中间删除字符。该函数很好。问题在于如何称呼它。您正在传递指向字符串常量或数组的指针吗?前者将导致崩溃。。问题在于您没有显示的代码。这就是为什么您需要创建并向我们显示。@Dagan No,'\0'==0。转义0将整数值零的八进制表示插入到字符串或字符中。使用C++关键字(如新的C代码)可能会导致混淆。对于这两个评论,我将在接下来的几分钟内发表或删除答案。谢谢。@EugeneSh编辑以按索引添加版本。谢谢
int RemoveCharFromString(const char *src, char *dst, char c)
{
const char *s;
char *d;
if ((char *)0 != src && (char *)0 != dst) {
for (d = dst, s = src; (*d = *s); s++) {
if (c != *d)
d++;
}
return 0;
}
return 1;
}