C语言里一个小疑点

C语言里一个小问题
源程序如下:
C/C++ code

main()
{
        char str1[20];
        char str2[20];
        scanf("%22s",str1);

        printf("your put char is %s",str1);
}



运行后我输入了1234567890123456789012345。
但输出效果如下:
C:\TC\TC201E\Project>test10
1234567890123456789012345
your put char is 1234567890123456789012your put char is 345

不明白的地方有两点:
1 str1申请的是20个存储单元,如果sancf里写22S的话,会是怎么存储的。
2 为什么会打印两次,而且打印的是连续的数据。
谢谢各位大侠啊。。。

------解决方案--------------------
1 越界存储在str1数组的后面 非法写内存 可能会崩溃
2 我这运行的结果没出现你说的情况
另外scanf("%2s",str1);
如输入12345则str1只获取12


------解决方案--------------------
数组的内存是连续分配的 非法占用内存 但是还是存储了的 但是当你的空间不够富裕的时候这样做事个错误
------解决方案--------------------
c 没有必要的检测,完全靠调用者来保证程序的使用

另一个问题没有看到
------解决方案--------------------
我用WIN-TC执行没有你说的这个情况。但是结果是只显示第一个字符。比如输入1 3 5 7,只返回1!
------解决方案--------------------
我想是这句代码的问题:
C/C++ code

   scanf("%22s",str1);

------解决方案--------------------
输入的数据存储在str1中及后面的存储单元,恰好后面的储单元是合法的(也有可能报错)
而输出时会输出一个字符串以'/0'结尾。
------解决方案--------------------
str1是20字符的内存,虽然可以接收22个,但运行时若输入超过20个字符容易造成错误
------解决方案--------------------
我的tinycc 0.9.25 for winxp报告是内存出错,不能写。
你写的意思很清楚,最多取22个字符到str1,而你的str1只有20个位置,scanf就一直往下写够22个字符,如果这后2个字符冲入了main函数的返回地址就会出错,另外输出的时候printf也不知道'\0'这个结束符在哪,就会一直输出直到遇见它。我的问题可能是第一个,第21,22个字符覆盖main的返回地址,至于在main函数的栈上面存的是什么就要看编译器的实现了。试着把str1和str2交换结果就会不同。

你的问题调试或反汇编一下就知道了。
另外我用的微型编译器有源代码http://bellard.org/tcc/
你可以下载来看看C编译器的实现。
------解决方案--------------------
printf遇\0结束,因此能输出,但是堆栈被破坏。