C语言无strrev实现字符串反转的do-while重复读取空串异常求解
异常产生原因
- 输入缓冲区残留:上一轮通过
scanf(" %c", &continue1)读取用户输入的续行标记时,用户输入完y后按下的回车键会在标准输入缓冲区留下换行符\n。scanf读完y后不会清除这个残留换行符,下一轮循环调用gets(text)时,gets会直接将缓冲区里的残留换行符识别为输入结束标记,不会阻塞等待用户输入新内容,直接返回空字符串。 - 变量未重置导致逻辑错误:
len变量定义在do-while循环外部,第一轮循环的反转逻辑会把len从字符串长度值一路递减到-1。第二轮进入循环时,len没有被重置为0,直接带着上一轮结束时的-1开始计算字符串长度。此时gets读到的是空字符串,text[0]就是字符串结束符'\0',计算长度的for循环条件text[i] != NULL直接不成立,循环一次都不执行,len始终保持-1。后续反转逻辑的循环条件是len >=0,-1不满足判断要求,循环一次都不执行,最终就出现了“字符串长度为-1、反转内容为空”的异常表现。
原代码附带的隐性问题:
- 反转逻辑从
text[len]开始遍历,实际会先输出字符串结束符'\0'(控制台不可见,但属于逻辑瑕疵) return 0写在getch()之前,导致getch()永远不会被执行到,程序会直接退出看不到运行结果
对应修复方法
- 每次读取新字符串前,清空输入缓冲区的残留字符:在
scanf读取完续行判断的字符后,循环读取缓冲区的剩余内容直到遇到换行符,避免残留内容干扰下一次输入 - 每次进入循环计算字符串长度前,强制将
len重置为0,不要复用循环外部变量的旧值 - 调整反转遍历的起始索引:从
len-1位置开始倒序输出到索引0,避免输出不可见的字符串结束符 - 将
getch()语句移到return 0之前,保证程序执行到控制台暂停逻辑时不会提前退出 - (可选优化)替换掉存在缓冲区溢出风险的
gets()函数,改用fgets()读取输入,同时手动清理fgets存储的末尾换行符
内容的提问来源于stack exchange,提问作者Suraj
相关产品推荐
相关产品推荐

