Онлайн компилятор C

#include <stdio.h> void my_strcpy(char dst[], char src[]) { int i = 0; while (src[i] != '.' && src[i] != '\0' && src[i] != '\n') { dst[i] = src[i]; i++; } dst[i] = '\0'; } void delete_char(char s[], char c) { char a[] = {0}; int i = 0; int j = 0; while (s[i] != '.' && s[i] != '\n' && s[i] != '\0') { if (s[i] == c) { a[j] = s[i]; j++; } i++; } my_strcpy(s, a); } int main() { char s[] = "bSSSSnana."; char c = 'a'; delete_char(s, c); printf("%s", s); return 0; }
这段代码试图删除字符串中的指定字符,但存在几个问题。

- 在 `delete_char` 函数中,数组 `a` 被声明为 `char a[] = {0};`,这只会创建一个长度为1的数组,无法存储多个字符。当 `j` 增加时,会写入数组边界之外,导致未定义行为。
- 逻辑上,`delete_char` 的循环将匹配的字符复制到 `a` 中,但你的意图应该是复制不匹配的字符(即保留非目标字符)。当前代码实际上是在收集被删除的字符,而不是保留它们。
- 最后用 `my_strcpy(s, a)` 将 `a` 复制回 `s`,但 `a` 中存储的是被删除的字符,而不是剩余字符。

- 检查 `delete_char` 中 `if` 条件的逻辑:当 `s[i] == c` 时,你将其放入 `a`,但应该是不等于 `c` 时才放入 `a`。
- 确保 `a` 有足够空间存储结果字符串,例如使用与 `s` 相同大小的数组,或者动态分配。