C 从二维字符数组打印字符串
我环顾四周,尝试了不同的语法,但我似乎无法让它工作。我知道这是基本的,但这不应该花太长时间去弄清楚 我有字符数组C 从二维字符数组打印字符串,c,arrays,string,char,printf,C,Arrays,String,Char,Printf,我环顾四周,尝试了不同的语法,但我似乎无法让它工作。我知道这是基本的,但这不应该花太长时间去弄清楚 我有字符数组 char *roster[2][14] = { {"13", "10", "24", "25", "15", "1", "00", "4", "11", "23", "22", "32", "3", "35"}, {"Isaiah Briscoe", "Jonny David", "EJ Floreal", "Dominique Hawkins", "Isaa
char *roster[2][14] = {
{"13", "10", "24", "25", "15", "1", "00", "4", "11", "23", "22", "32", "3", "35"},
{"Isaiah Briscoe", "Jonny David", "EJ Floreal", "Dominique Hawkins", "Isaac Humphries", "Skal Labissiere", "Marcus Lee", "Charles Matthews", "Mychal Mulder", "Jamal Murray", "Alex Poythress", "Dillon Pulliam", "Tyler Ulis", "Derrick Willis"}
};
然后我从数组中生成一个随机元素
random = rand() % 14;
printf("What is %s 's number?", roster[2][random]);
然后我试着打印出来,但失败了
printf("What is %s 's number?", roster[2][random]);
它输出
What is (null) 's number?
lldb显示printf语句跳转到
libsystem_c.dylib`strlen:
-> 0x7fff9a596d32 <+18>: pcmpeqb (%rdi), %xmm0
0x7fff9a596d36 <+22>: pmovmskb %xmm0, %esi
0x7fff9a596d3a <+26>: andq $0xf, %rcx
0x7fff9a596d3e <+30>: orq $-0x1, %rax
libsystem_c.dylib`strlen:
->0x7fff9a596d32:pcmpeqb(%rdi),%xmm0
0x7fff9a596d36:pmovmskb%xmm0,%esi
0x7fff9a596d3a:andq$0xf,%rcx
0x7fff9a596d3e:orq$-0x1,%rax
调用未定义的行为访问索引越界
因为您可以有索引花名册[0][random]和花名册[1][random]
而不是花名册[2][random]
,因为它被声明为-
char *roster[2][14] = {
{"13", "10", "24", "25", "15", "1", "00", "4", "11", "23", "22", "32", "3", "35"},
{"Isaiah Briscoe", "Jonny David", "EJ Floreal", "Dominique Hawkins", "Isaac Humphries", "Skal Labissiere", "Marcus Lee", "Charles Matthews", "Mychal Mulder", "Jamal Murray", "Alex Poythress", "Dillon Pulliam", "Tyler Ulis", "Derrick Willis"}
};
你可以把这些打印出来-
printf("What is %s 's number?", roster[1][random]);
或-
数组索引从
0
开始
对于char*花名册[2][14]代码>,可能的索引为
roster[0][random];
roster[1][random];
c中的数组从0开始,因此如果声明:
char *roster[2]
那么您只能引用花名册[0]和花名册[1]。如何失败?输出是什么?random
是一个众所周知的系统函数名,在stdlib.h中定义。将变量名声明为与系统函数名相同是个坏主意。
roster[0][random];
roster[1][random];
char *roster[2]