C语言串输入问题

来源:百度知道 编辑:UC知道 时间:2024/06/30 22:04:13
1.char * str1; scanf("%s", str1 ); printf( "%s", str1 );
2.char str2[2];scanf("%s", str2 ); printf( "%s", str2 );
以上两个函数,结果是一样的。
不管你输入几个字符,都会照样输出。为什么数组的2没有起到作用呢?而且不为str1分配内存,也可以照样存储呢?有谁能为我说明一下其中的原理~~~
===================
请大家用WIN-TC编译下啊,结果是一样的。。
并不会出现编译不过的问题。

首先,你的结果是错的。(VC6.0)
1.char * str1; scanf("%s", str1 ); printf( "%s", str1 );
=>这个是不可能运行的。你定义的指针str1没有申请空间。在运行中,你输入的字符串并不是一个存储在静态区的常量,而是一个值,你把这个值赋给一个没分配空间的地址,如何可以赋值。scanf是输入函数,要求把值输入到指定的地址空间,而你这个地址根本没有空间。

2.char str2[2];scanf("%s", str2 ); printf( "%s", str2 );
=>可以得到结果,但是内存错误。这个原因和上面的人提出来的一致。数组虽然规定了大小,但是数组越界,在编译时是不会报错的。运行时,如果数组越界可能会导致内存错误,从而我们知道数组越界了。但是很多情况,数组越界可能只是在运行中改变了一个我们不想改变的值,并不会弹出内存错误,因而导致我们无法想象的问题。关于这个话题,讲解起来,很多很麻烦。你可以自己去看看数组越界的情况。

楼下主管 6级的回答,完全是胡说八道,学过C语言没。晕死了~去温习下书本吧。

补充回答:虽然编译器不一样,但是原理均同。根据题目,需要考察的内容应该是指针只想常量区的字符串和用数组存储字符串的区别,分析如上。如果是实际编码,是不允许这么编码的。(定义指针不申请空间、数组越界)

1. 系统会自动分配内存存储输入的字符串,然后把头指针赋给str1
2. [2]为什么不起作用.....不太清楚....坐等高人...

2起作用了,只是你输入的多于2个字符,那么多余的就自动存储到后面接下来的存储单元,占用后面是内存空间,要是后面的存储单元被别的程序用了,那你运行的时候就会出现问题,要是后面是空间没有被别的程序用那就没什么问题。指针指的是一个字符串或数组等的首地址。

DEV-C++
你的第一句不能运行,因为没有为str1分配内存,
你的第二句可运行,但不能超过两个字符,否则内存错误

首先要知道scanf的输入格式,字符串是不能用scan