c - 从 c 字符串中删除 charAt

标签 c string char

我正在尝试用 C 编写简单的 removeAt(char* str, int pos),但对结果感到困惑。

char c[] = "abcdef";
char* c1 = removeAt(c, 3);

cout << c1;

如果我这样做:

static char* removeAt(char* str, int pos)
{
   int i = 0;

   for(i = pos; str[i] != '\0'; i++)
   {
       str[i] = str[++i];
   }

   str[i] = '\0';

   return str;
}

字符串保持不变 "abcdef";

如果我在做:

static char* removeAt(char* str, int pos)
{
 int i, k =0;

for(i = pos, k = pos;  str[i] != '\0'; i++)
{
   str[i] = str[++k];
}

str[i] = '\0';

return str;
}

确实按预期工作。

最佳答案

在这个循环中

for(i = pos; str[i] != '\0'; i++)
{
    str[i] = str[++i];
}

您通过执行 i++ 更改了 i 的值,因此您最终会每两个字符或类似的字符丢失一个字符。将 i++ 更改为 i+1

编辑:顺便说一下,这条线

str[i] = str[++i] 

是未定义的行为,因为它没有指定何时发生增量(在评估左侧之前或之后?)。如果首先评估右侧,那么您的代码将是

i++;
str[i] = str[i];

如您所见,实际上什么都不做。

关于c - 从 c 字符串中删除 charAt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20527214/

相关文章:

c - 在 C 中分割字符串会导致段错误(核心转储)

java - 特殊形式的字符串输入验证

c++ - 释放后分配给指针

c - 如何从 Conan 配方中的要求中获取正确的值用作 CMake 参数?

c - 将 sqlite3_column_text() 返回到文字字符串

c++ - push_back()文件系统::path的.string()。data()的怪异行为导致生成 “vector<const char *>”

c++ - 允许用户输入名字和姓氏;向用户显示全名(名字+姓氏)

Python 安装脚本扩展,如何包含 .h 文件?

c - 理解宏扩展规则的问题

c++ - 为字符串类 C++ 重载 >> 运算符