You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
}

改动说明

  1. 输入侧优化:缓冲区扩容到1024字节,替换gets()为安全的fgets(),新增换行符处理逻辑,避免输入异常
  2. 新增原始输入备份:用original_input数组存储用户输入内容,满足第一行输出原始句子的需求
  3. 输出逻辑拆分:先遍历输出整行反转后的句子,再二次遍历拆分单词打印对应地址,完全匹配期望输出格式
  4. 地址计算修复:取&input[j+1]作为单词首地址,新增对齐补空格逻辑,输出格式和示例一致
  5. 语法合规化:修正main函数返回值为int,修复格式符错误,兼容标准C编译要求

注:_strrev为Windows MSVC编译器特有函数,若需跨平台运行可自行实现字符串反转逻辑替换即可。

内容的提问来源于stack exchange,提问作者Centadmin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:36:03