C语言指针与传引用参数传递问题及字符串反转代码报错咨询
字符串反转函数的问题分析与修复
问题原因拆解
1. 反转内容未存入目标字符串inversione
- 主函数中错误初始化
inversione[0] = '\0',导致strlen(inversione)直接返回0,后续遍历打印的循环完全不执行。 char inversione[strlen(stringa1)]的长度仅等于原字符串的有效字符数,未预留存储字符串结束符'\0'的空间,反转后的内容无法被字符串函数正确识别为合法C字符串。
2. 函数中最后一个字符'A'未输出
- 第一个循环执行
dim次cstringa++,最终指针指向原字符串的结束符'\0',而非最后一个有效字符。 - 第二个循环首次赋值的是
'\0'(无可见打印内容),后续循环处理的是从倒数第二个字符开始的内容,当循环结束时,原字符串的第一个字符'A'尚未被处理,因此不会被打印。
修正后的代码
修正后的inverter函数
void inverter(char* cstringa, int dim, char* inversion) { printf("%d\n", dim); // 移动指针到原字符串最后一个有效字符位置(跳过结束符) for (int i = 0; i < dim - 1; i++) { cstringa++; } for (int i = 0; i < dim; i++) { *inversion = *cstringa; printf("%c", *inversion); inversion++; cstringa--; } // 为反转后的字符串添加结束符,确保是合法C字符串 *inversion = '\0'; }
修正后的主函数
#include <stdio.h> #include <string.h> int main() { char stringa1[11] = {'A', 'l', 'e', 's', 's', 'a', 'n', 'd', 'r', 'o', '\0'}; char* pstringa1 = stringa1; // 分配空间时多留1位存储字符串结束符 char inversione[strlen(stringa1) + 1]; char* pinversione = inversione; inverter(stringa1, strlen(stringa1), inversione); printf("\n反转后的字符串:"); for(int i = 0; i < strlen(inversione); i++) { printf("%c", *pinversione); pinversione++; } printf("\n"); return 0; }
修正说明
- 调整第一个循环的次数为
dim-1,让指针停在原字符串的最后一个有效字符上,避免从结束符开始赋值。 - 在
inverter函数末尾添加*inversion = '\0',确保反转后的内容是标准的C字符串。 - 主函数中修改
inversione的长度为strlen(stringa1)+1,预留结束符的存储空间,同时移除错误的inversione[0] = '\0'初始化。
内容的提问来源于stack exchange,提问作者Alessandro Argentini
相关产品推荐
相关产品推荐

