char name[1],但当我输入13个字符时,屏幕上会发生很多事情
它来自于“C初级读物+4.2.2字符串”一书 我正在使用macxcode亲自尝试示例代码 代码如下:char name[1],但当我输入13个字符时,屏幕上会发生很多事情,c,arrays,char,C,Arrays,Char,它来自于“C初级读物+4.2.2字符串”一书 我正在使用macxcode亲自尝试示例代码 代码如下: #include <stdio.h> #define PRAISE "You are an extraordinary being." int main(void) { char name[1]; printf("What\'s your name?\n"); scanf("%s", name); printf("Hello, %s. %s\n",
#include <stdio.h>
#define PRAISE "You are an extraordinary being."
int main(void)
{
char name[1];
printf("What\'s your name?\n");
scanf("%s", name);
printf("Hello, %s. %s\n", name, PRAISE);
return 0;
}
#包括
#定义赞美“你是一个非凡的存在。”
内部主(空)
{
字符名[1];
printf(“你叫什么名字?\n”);
scanf(“%s”,名称);
printf(“你好,%s.%s\n”,姓名,赞美);
返回0;
}
当我输入“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
libdyld.dylib`dyld3::MachOFile::forEachLoadCommand:
0x7fff697aa8a8 <+0>: pushq %rbp
0x7fff697aa8a9 <+1>: movq %rsp, %rbp
0x7fff697aa8ac <+4>: pushq %r15
0x7fff697aa8ae <+6>: pushq %r14
0x7fff697aa8b0 <+8>: pushq %r13
0x7fff697aa8b2 <+10>: pushq %r12
0x7fff697aa8b4 <+12>: pushq %rbx
0x7fff697aa8b5 <+13>: subq $0x28, %rsp
0x7fff697aa8b9 <+17>: movb $0x0, -0x29(%rbp)
0x7fff697aa8bd <+21>: movq %rdx, %r12
0x7fff697aa8c0 <+24>: movq %rsi, %rbx
0x7fff697aa8c3 <+27>: movq %rdi, %r15
-> 0x7fff697aa8c6 <+30>: movl (%r15), %edx
0x7fff697aa8c9 <+33>: cmpl $0xfeedface, %edx ;
imm = 0xFEEDFACE
0x7fff697aa8cf <+39>: je 0x7fff697aa8e3 ;
<+59>
0x7fff697aa8d1 <+41>: cmpl $0xfeedfacf, %edx ;
imm = 0xFEEDFACF
Diagnostics::error(char const*, ...)
0x7fff697aa9a2 <+250>: addq $0x10, %rsp
0x7fff697aa9a6 <+254>: addq $0x28, %rsp
0x7fff697aa9aa <+258>: popq %rbx
0x7fff697aa9ab <+259>: popq %r12
0x7fff697aa9ad <+261>: popq %r13
0x7fff697aa9af <+263>: popq %r14
0x7fff697aa9b1 <+265>: popq %r15
0x7fff697aa9b3 <+267>: popq %rbp
0x7fff697aa9b4 <+268>: retq
libdyld.dylib`dyld3::MachOFile::forEachLoadCommand:
0x7fff697aa8a8:pushq%rbp
0x7fff697aa8a9:movq%rsp%rbp
0x7fff697aa8ac:pushq%r15
0x7fff697aa8ae:pushq%r14
0x7fff697aa8b0:pushq%r13
0x7fff697aa8b2:pushq%r12
0x7fff697aa8b4:pushq%rbx
0x7fff697aa8b5:subq$0x28,%rsp
0x7fff697aa8b9:movb$0x0,-0x29(%rbp)
0x7fff697aa8bd:movq%rdx,%r12
0x7fff697aa8c0:movq%rsi,%rbx
0x7fff697aa8c3:movq%rdi,%r15
->0x7fff697aa8c6:movl(%r15),%edx
0x7fff697aa8c9:cmpl$0xfeedface,%edx;
imm=0xFEEDFACE
0x7fff697aa8cf:je 0x7fff697aa8e3;
0x7fff697aa8d1:cmpl$0xfeedfacf,%edx;
imm=0xFEEDFACF
诊断::错误(字符常量*,…)
0x7fff697aa9a2:addq$0x10,%rsp
0x7fff697aa9a6:addq$0x28,%rsp
0x7fff697aa9aa:popq%rbx
0x7fff697aa9ab:popq%r12
0x7fff697aa9ad:popq%r13
0x7fff697aa9af:popq%r14
0x7fff697aa9b1:popq%r15
0x7fff697aa9b3:popq%rbp
0x7fff697aa9b4:retq
为了简单起见,我省略了上面的一些代码
如果我输入更多字母,说20“a”,
它返回:错误:0x7fff00616000的内存读取失败
如果我将第五行更改为:
字符名[2]
输入14个字符,返回相同的结果
同样地,
如果我将第五行更改为:
字符名[3]
输入15个字符,返回相同的结果
我知道这与aaray的大小有关,但是,我不知道括号中的数字如何与相应的输入字符数连接。有人能详细解释一下吗?
char name[1]代码>的大小仅足以存储单个字符。如果尝试向其中存储多个字符,则剩余的字符将在数组结束后写入内存,这可能会覆盖“重要”数据,导致崩溃(或者更糟的是,损坏其他地方使用的数据)
字符串是包含0值终止符的字符值序列。如果要存储N
-字符串,则需要分配一个宽度至少为N
+1个元素的数组。因此,如果您想在name
中存储最多13个字符的字符串,那么需要将其声明为
char name[14]; // +1 to hold the string terminator
仍然有可能在字符串中写入的字符数超过其大小,因此在输入端需要小心scanf
允许您指定要读取的最大字符数:
scanf( "%13s", name ); // at most 13 characters read into name
不幸的是,该字段宽度不能用参数指定(在printf
中可以这样)。另一种选择是根本不使用scanf
,而是使用fgets
:
fgets( name, sizeof name, stdin );
fgets
将从stdin
读取不超过sizeof name
-1个字符,并将它们写入name
,然后将0终止符添加到name
的末尾sizeof name
计算为name
中的字节数 屏幕上发生的奇怪事情是因为您指定了创建的数组“1”(即名称[1])的限制,因此输入最多只能有一个字符。您应该将数组的限制编辑为15个或更多(即字符名[15]),因此用户输入将增加到15个,因此最多可以输入15个字符。希望这有帮助 “我知道这与Aray的大小有关,但是,我不知道括号中的数字是如何与相应的输入字符数连接的。”它必须足够大,以适合您的输入,否则您会出现未定义的行为,这可能表现为您观察到的“奇怪的事情”。如果您的阵列不够大,程序可能仍会尝试,这可能会损坏其他地方的内存。如果您有一个可以容纳1升水的瓶子,但您尝试向其中倒入15升水,结果将是一团混乱。为了防止这种混乱,我们通过限制可以输入的内容来保护阵列。此处scanf(“%1s”,名称)
添加的1
是数组字符名[1]中可用的存储字节数很遗憾,你在那本书中发现了一个bug。(不幸的是,那本书包含很多bug。如果你有一本更好的书,就扔掉C Primer Plus,不要再浪费时间了。)@WeatherVane,当然,这是一个非常无用的修复方法!Lydia,我建议将数组更改为char name[31]
,然后使用scanf(“%30s”,name)
#定义数组_基_长7#定义数组_长(数组_基_长+1)数组[数组_长];扫描频率(“%”#数组_基_长度“s”,数组)代码>将是一个小技巧,以避免重复神奇的数字。不是很好,但是如果使用scanf
一次读取多个不同的值,或者使用周围的上下文(@lydia:如果这样做,请始终检查实际读取的值的数量,即scanf的返回值!),可能会有所帮助。