C语言字符串首字符删除功能失效求助(附代码)
代码问题分析与修复方案
你的代码存在三个关键问题,导致无法实现删除首字符的功能:
- 函数调用传参错误:
main里调用remfirst(&string[32])时,string[32]已经超出了数组的有效索引范围(数组string的索引是0到31),函数根本没拿到目标字符串的起始地址,自然无法修改原字符串。正确的传参应该是remfirst(string)(数组名本身就是首元素地址)或者remfirst(&string[0])。 - printf参数冗余:
printf("%s", &string)里的&string完全多余,直接传递string即可,数组名本身就代表首元素的地址,符合printf对%s参数的要求。 - 循环条件越界:
remfirst函数中的循环条件i <= strlen(arr)会导致越界访问:当i等于字符串长度时,arr[i+1]访问的是字符串结束符'\0'之后的内存,属于非法操作。正确的条件应该是i < strlen(arr),这样循环会把从第1个字符到最后一个有效字符依次前移一位,最后自动把'\0'移到合适的位置,完成字符串截断。
另外建议提前计算字符串长度,避免循环中反复调用strlen(每次调用都会遍历字符串,影响效率)。
修复后的完整代码:
#include <stdio.h> #include <string.h> void remfirst(char arr[]) { int len = strlen(arr); for(int i = 0; i < len; i++) { arr[i] = arr[i+1]; } } int main() { char string[32]; fgets(string, 32, stdin); remfirst(string); printf("%s", string); return 0; }
内容的提问来源于stack exchange,提问作者gent9
相关产品推荐
相关产品推荐

