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

C语言打印char数组指针结果不符合预期,寻求问题原因及解决方案

问题核心原因
  • 你定义的char customer_name[SIZE]是单块总长度仅10字节的一维字符数组,仅能存储1个合法C字符串(最长9个可见字符+1个结束符\0)。循环存储多个客户姓名时,后输入的内容会直接覆盖前面的存储内容,且你每次从customer_name[i]偏移位置存储姓名,会导致最终读取到的字符串是多段输入拼接的错乱内容。
  • 输入时scanf_s("%9s", &customer_name[i], 10)的缓冲区长度参数错误:从i偏移位置开始的剩余存储空间不足10字节,存在缓冲区溢出风险。
  • 输出时没有加换行分隔,所有姓名会打印在同一行,进一步影响可读性。
修复方案(推荐初学者使用多维数组实现)

你确实需要用二维字符数组存储多个客户姓名,修改后的可运行代码如下:

#include<stdio.h>
#define SIZE 10

int main() {
        int no_of_customers;
        // 第一维控制最多存储的客户数,第二维控制单个姓名的最大长度
        char customer_name[SIZE][SIZE];
        char* customer_namePtr[SIZE];
    
        printf("enter number of customers you wish to add ");
        // 增加输入合法性判断,避免输入的客户数超过数组最大容量
        scanf_s("%d", &no_of_customers);
        if (no_of_customers > SIZE) {
            printf("最多支持输入%d个客户\n", SIZE);
            no_of_customers = SIZE;
        }
    
        for (int i = 0; i < no_of_customers; ++i) {
            printf("Enter %d customer's name ", i + 1);
            // 数组名本身就是首地址,不需要额外取地址,缓冲区长度传SIZE即可
            scanf_s("%9s", customer_name[i], SIZE);
            customer_namePtr[i] = customer_name[i];
        }
        puts("");
    
        printf("customer name's are:\n");
    
        for (size_t i = 0; i < no_of_customers; ++i) {
            // 增加换行分隔每个姓名
            printf("%s\n", customer_namePtr[i]);
            // 如果不需要指针数组,也可以直接打印二维数组元素:printf("%s\n", customer_name[i]);
        }
        return 0;
}
  • 额外补充:如果不需要用指针数组做后续操作,可以直接删掉customer_namePtr相关代码,直接遍历打印二维数组的customer_name[i]即可,逻辑更简洁。

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

相关产品推荐
方舟 Agent Plan

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

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