如何访问二维字符数组中的字符?代码无输出问题求解
问题分析与解决
为什么puts(text[1][0])没有输出?
核心问题是**puts函数的参数类型不匹配**:
puts要求传入字符串的首地址(char*类型),用来输出整个字符串。- 而
text[1][0]是单个字符(char类型),把它传给puts时,程序会把该字符的ASCII值当作内存地址去访问,属于未定义行为,要么无输出,要么直接崩溃。
另外还有两个潜在问题:
gets函数已被C标准废弃,存在缓冲区溢出风险,建议替换为fgets(text[i], len, stdin),同时手动去除fgets读取到的换行符:fgets(text[i], len, stdin); text[i][strcspn(text[i], "\n")] = '\0';- 如果用户输入行数少于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
相关产品推荐
相关产品推荐

