在线编译器 C

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

代码中声明了一个长度为0的数组 `char a[m]={0};`,但 `m` 初始为0,这导致数组大小为0,无法存储任何字符。后续向 `a[m]` 赋值会越界写入,这是未定义行为。

另外,删除逻辑也有问题:当遇到要删除的字符时,`m` 仍然递增,导致 `a` 数组中对应位置未被赋值,但 `m` 已经增加,最终复制回 `s` 时会出现空位。

- 数组 `a` 的大小不能是0,需要根据实际需要动态确定大小,或者直接原地修改原字符串而不使用辅助数组。
- 删除字符时,只有不匹配的字符才应该存入结果,并且索引 `m` 应该只在存入字符时递增,而不是每次循环都递增。