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

如何访问二维字符数组中的字符?代码无输出问题求解

问题分析与解决

为什么puts(text[1][0])没有输出?

核心问题是**puts函数的参数类型不匹配**:

  • puts要求传入字符串的首地址(char*类型),用来输出整个字符串。
  • 而text[1][0]是单个字符(char类型),把它传给puts时,程序会把该字符的ASCII值当作内存地址去访问,属于未定义行为,要么无输出,要么直接崩溃。

另外还有两个潜在问题:

  1. gets函数已被C标准废弃,存在缓冲区溢出风险,建议替换为fgets(text[i], len, stdin),同时手动去除fgets读取到的换行符:
    fgets(text[i], len, stdin);
    text[i][strcspn(text[i], "\n")] = '\0';
    
  2. 如果用户输入行数少于2行(比如只输入1行就回车退出),text[1]未被初始化,此时访问text[1][0]会读取垃圾值,同样是未定义行为。

正确输出第二个字符串的第一个字符

用printf配合%c格式符输出单个字符,同时先判断输入行数是否足够:

#include <stdio.h>
#include <string.h>
#define max 50
#define len 30
char text[max][len];

int main(){ // 标准C中main的返回类型应为int
    int i;
    printf("Enter an empty line to quit\n");
    for(i = 0; i < max; i++){
        fgets(text[i], len, stdin);
        text[i][strcspn(text[i], "\n")] = '\0'; // 去除换行符
        if(!*text[i]){break;}
    }
    // 判断是否输入了至少2行
    if(i >= 2){
        printf("%c\n", text[1][0]); // 用%c输出单个字符
    } else {
        printf("You didn't enter enough lines!\n");
    }
    return 0;
}

如何访问字符串数组中的单个字符或部分字符串

1. 访问单个字符

直接通过二维数组下标访问:

  • text[n][m]:表示第n+1个字符串的第m+1个字符(数组下标从0开始)
  • 示例:若text[0]是"hello",text[0][1]就是字符'e'

2. 访问部分字符串

常见实现方式:

  • 用printf指定输出长度:通过%.ks格式符输出字符串的前k个字符
    printf("First 3 characters of first string: %.3s\n", text[0]);
    
  • 用指针截取子串:利用字符串数组的指针特性,text[n]+k表示从第n+1个字符串的第k+1个字符开始的子串
    puts(text[0]+2); // 若text[0]是"hello",会输出"llo"
    
  • 用strncpy复制部分字符串:将指定长度的字符复制到新数组,需手动添加字符串结束符
    char sub[len];
    strncpy(sub, text[1], 4); // 复制第二个字符串的前4个字符
    sub[4] = '\0'; // 手动添加结束符
    puts(sub);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:16:07