如何在C语言反转句子的程序中正确打印每个单词的内存地址?
C语言单词反转功能地址打印适配方案
原有代码问题梳理
- 输入缓冲区仅20字节,无法容纳测试用例长度的句子,且使用已被C标准废弃的
gets()函数,存在缓冲区溢出风险 - 未备份原始输入内容,直接修改原数组反转后无法输出期望的原始输入行
- 单词首地址计算错误:内层循环结束时j指向单词前的空格位置或下标-1,
&input[j]并非单词首地址,正确应为&input[j+1] - 输出逻辑不匹配需求:未先输出整行反转后的句子,边拆分单词边打印的逻辑不符合期望效果
- 语法不规范:
void main不符合C标准定义,% p格式符中间存在多余空格
修改后可运行代码
#include <stdio.h> #include <string.h> int main() { printf("======================================================================"); printf("\nProgram that asks user for a sentence and then it reverses the words"); printf("\n===================================================================="); char input[1024], original_input[1024]; int i,j; puts("\n\nEnter the sentence to be reversed::\n"); fgets(input, sizeof(input), stdin); // 去除fgets读入的末尾换行符 input[strcspn(input, "\n")] = '\0'; // 备份原始输入 strcpy(original_input, input); printf("Input addr: %p\n", input); // 打印原始输入行 printf("\n%s\n", original_input); // 反转整个字符串 _strrev(input); printf("The reversed sentence is:: \n\n"); // 先打印整行反转后的句子 for(i=0; input[i]!='\0'; i++) { if (input[i + 1] == ' ' || input[i + 1] == '\0') { for (j = i; j >= 0 && input[j] != ' '; j--) { printf("%c", input[j]); } printf(" "); } } printf("\n"); // 再遍历打印每个单词和对应首地址 for(i=0; input[i]!='\0'; i++) { if (input[i + 1] == ' ' || input[i + 1] == '\0') { int word_len = 0; for (j = i; j >= 0 && input[j] != ' '; j--) { printf("%c", input[j]); word_len++; } // 补空格对齐 for(int k = 0; k < 6 - word_len; k++) { printf(" "); } // 修正地址为单词首地址 printf("%p\n", &input[j+1]); } } return 0; }
改动说明
- 输入侧优化:缓冲区扩容到1024字节,替换
gets()为安全的fgets(),新增换行符处理逻辑,避免输入异常 - 新增原始输入备份:用
original_input数组存储用户输入内容,满足第一行输出原始句子的需求 - 输出逻辑拆分:先遍历输出整行反转后的句子,再二次遍历拆分单词打印对应地址,完全匹配期望输出格式
- 地址计算修复:取
&input[j+1]作为单词首地址,新增对齐补空格逻辑,输出格式和示例一致 - 语法合规化:修正main函数返回值为int,修复格式符错误,兼容标准C编译要求
注:
_strrev为Windows MSVC编译器特有函数,若需跨平台运行可自行实现字符串反转逻辑替换即可。
内容的提问来源于stack exchange,提问作者Centadmin
相关产品推荐
相关产品推荐

