耽误同志们2分钟,问一个简单问题

时间:2021-10-30 08:06:08
char c1[20],c2;
scanf ("%c%1s",&c1,&c2);
输入:string c
结果是什么,为什么?

31 个解决方案

#1


up

#2


编译能通过吗?&c1?

#3


看来我水平太差,不过现在也没法试试。

#4


打错了,是c1,没有&

#5


你的这个代码有问题呀。
首先%c &c1 就是说只给c1[0]赋值咯?
然后又让c2接受一个%s的赋值。。

因为c1[0] = s ... 而其他部分。。。都是未知的数值。。所以肯定显示乱码。
c2是t

#6


打错了,是c1,没有&


也是一样的吧

#7


没有环境,我想应该是:
c1[0]里是'g',
c2里是'c'。

#8


不知道你想要什么?按照你的代码,我的输出语句 printf("\n%c%ls",c1,c2); 输出的结果是乱码,不知是不是我没做对;另外,c1是字符串,对字符串赋值好像不应该像你这样做吧,而应该每个数组元素单独赋值,或者好像可以用 %s ,你试试看。

#9


main()
{
 char c1[20],c2;
 scanf("%s %c",&c1,&c2);
 printf("\n%s%c",c1,c2);
 getch();
}
输入 string c
输出 string c

#10


楼上错误


 scanf("%s %c",&c1,&c2);
               ~~~~应该是c1或者&c1[0]

#11


根本就是内存越界的东西。根本就不应该讨论这种代码的运行情况,这种代码运行的结果是没有定义的。

#12


to peter:你可以试试看,我记得 &c1 就是取c1字符串的首元素的地址,就是说相当于%c1[0]的效果;当然,因为我毕业后就几乎没编过程了,不排除是我记得不对,但我上面的代码确实能运行,并能得到这个结果。

#13


运行没有问题 我也试验过的 。可是应该不太规范吧 
我不太清楚
请高手赐教

#14


main()
{
char c1[20],c2;
scanf("%c%1s",&c1,&c2);
printf("\n%s;%c",c1,c2);
getch();
}

大家可以用这个程序试试。
输入:string c
输出:s;t

为什么呢?看“scanf("%c%1s",&c1,&c2)”中第一个变量:c1==c1[0],那么&c1==&c1[0],c1[0]是char型,那么scanf("%c",&c1[0])有什么错误?那么将输入缓冲的第一个字符's'被放入c1[0]。此时,因为有一个%c被放入变量,scanf该处理下一个%1s了,同时变量地址指向&c2。%1s:一个字符长的字符串,c2:char型,也是一个字符长,相符合,那么将输入缓冲的第二个字符't'放入c2,条件满足,scanf退出。
因此,c1[0]=='s',即字符串c1=="s"(这要看编译器,有的在char c1[20]时会自动将这20个字符全清零,有的不会。这里只说清零的情况,不清零输出时就会造成乱码的情况,这不影响本说明),c2='t',输出:s;t。

我认为楼主提出这样的问题很好,是应该讨论讨论!浮躁是学不到知识的。
下面这个帖子和本帖类似,希望大家也看看,有好处的:
http://community.csdn.net/Expert/topic/3056/3056788.xml?temp=.1162378

#15


学习!

#16


不错~~没什么可以补充的~~

#17


他的师没输入的!!

#18


只要理解清了%C与%S两个的含义以及字符数组应该以"\0"结尾,就应该知道程序输出的结果。

#19


char c1[20],c2;
scanf ("%c%1s",&c1,&c2);
printf("\n%s;%c",c1,c2);
输入:string c
输出: s;t


scanf()函数是格式化输入函数, 它从标准输入设备(键盘) 读取输入的信息。 
其调用格式为: 
      scanf("<格式化字符串>", <地址表>); 
    格式化字符串包括以下三类不同的字符; 
    1. 格式化说明符: 格式化说明符与printf()函数中的格式说明符基本相同。 
    2. 空白字符: 空白字符会使scanf()函数在读操作中略去输入中的一个或多 
个空白字符。 
    3. 非空白字符: 一个非空白字符会使scanf()函数在读入时剔除掉与这个非 
空白字符相同的字符。 
    地址表是需要读入的所有变量的地址, 而不是变量本身。这与printf()函数 
完全不同, 要特别注意。各个变量的地址之间同","分开。

#20


这个是不是你们老师出的??
你们老师在整你耶

#21


内存泄漏,如果考虑缓冲区溢出攻击的话还有些价值
要么就是研究C语言内部的结构

#22


内存泄漏,如果考虑缓冲区溢出攻击的话还有些价值 
 

此话怎讲?高手指点

#23


#include<stdio.h>

int main(void) {

char static c1[20],c2;

scanf ("%c%ls",&c1,&c2);
printf("%s;%c\n",c1,c2);
printf("%c",&c1);/* 输出在static下 输出是空的 */

return 0;
}

输入string c
输出
s;t

更改输入&cl也没有改变

如果改成
#include<stdio.h>

int main(void) {

char c1[20],c2;

scanf ("%c%ls",&c1,&c2);
printf("%s;%c\n",c1,c2);
printf("%c",&c1);

return 0;
}
输入string c
输出
 ;t
H

而不用static状态,即使你更改输入 cl的输出还是H

#24


up

#25


好模糊啊

#26


printf("%c",&c1);
------------------------------------
将c1的地址按照字符型显示出来??这会显示什么呢?

#27


好象题不对!

#28


对于LearnAndStudy(c@ini@o) 的回复。。。好象不太懂

#29


哈哈,c1[20]跟c2在内存中是相邻的。一般的编译器会把c2放在低的地址,c1[20]在后面。不用我说结果了吧。

#30


我刚刚学习c,看不懂地说

#31


UP

#1


up

#2


编译能通过吗?&c1?

#3


看来我水平太差,不过现在也没法试试。

#4


打错了,是c1,没有&

#5


你的这个代码有问题呀。
首先%c &c1 就是说只给c1[0]赋值咯?
然后又让c2接受一个%s的赋值。。

因为c1[0] = s ... 而其他部分。。。都是未知的数值。。所以肯定显示乱码。
c2是t

#6


打错了,是c1,没有&


也是一样的吧

#7


没有环境,我想应该是:
c1[0]里是'g',
c2里是'c'。

#8


不知道你想要什么?按照你的代码,我的输出语句 printf("\n%c%ls",c1,c2); 输出的结果是乱码,不知是不是我没做对;另外,c1是字符串,对字符串赋值好像不应该像你这样做吧,而应该每个数组元素单独赋值,或者好像可以用 %s ,你试试看。

#9


main()
{
 char c1[20],c2;
 scanf("%s %c",&c1,&c2);
 printf("\n%s%c",c1,c2);
 getch();
}
输入 string c
输出 string c

#10


楼上错误


 scanf("%s %c",&c1,&c2);
               ~~~~应该是c1或者&c1[0]

#11


根本就是内存越界的东西。根本就不应该讨论这种代码的运行情况,这种代码运行的结果是没有定义的。

#12


to peter:你可以试试看,我记得 &c1 就是取c1字符串的首元素的地址,就是说相当于%c1[0]的效果;当然,因为我毕业后就几乎没编过程了,不排除是我记得不对,但我上面的代码确实能运行,并能得到这个结果。

#13


运行没有问题 我也试验过的 。可是应该不太规范吧 
我不太清楚
请高手赐教

#14


main()
{
char c1[20],c2;
scanf("%c%1s",&c1,&c2);
printf("\n%s;%c",c1,c2);
getch();
}

大家可以用这个程序试试。
输入:string c
输出:s;t

为什么呢?看“scanf("%c%1s",&c1,&c2)”中第一个变量:c1==c1[0],那么&c1==&c1[0],c1[0]是char型,那么scanf("%c",&c1[0])有什么错误?那么将输入缓冲的第一个字符's'被放入c1[0]。此时,因为有一个%c被放入变量,scanf该处理下一个%1s了,同时变量地址指向&c2。%1s:一个字符长的字符串,c2:char型,也是一个字符长,相符合,那么将输入缓冲的第二个字符't'放入c2,条件满足,scanf退出。
因此,c1[0]=='s',即字符串c1=="s"(这要看编译器,有的在char c1[20]时会自动将这20个字符全清零,有的不会。这里只说清零的情况,不清零输出时就会造成乱码的情况,这不影响本说明),c2='t',输出:s;t。

我认为楼主提出这样的问题很好,是应该讨论讨论!浮躁是学不到知识的。
下面这个帖子和本帖类似,希望大家也看看,有好处的:
http://community.csdn.net/Expert/topic/3056/3056788.xml?temp=.1162378

#15


学习!

#16


不错~~没什么可以补充的~~

#17


他的师没输入的!!

#18


只要理解清了%C与%S两个的含义以及字符数组应该以"\0"结尾,就应该知道程序输出的结果。

#19


char c1[20],c2;
scanf ("%c%1s",&c1,&c2);
printf("\n%s;%c",c1,c2);
输入:string c
输出: s;t


scanf()函数是格式化输入函数, 它从标准输入设备(键盘) 读取输入的信息。 
其调用格式为: 
      scanf("<格式化字符串>", <地址表>); 
    格式化字符串包括以下三类不同的字符; 
    1. 格式化说明符: 格式化说明符与printf()函数中的格式说明符基本相同。 
    2. 空白字符: 空白字符会使scanf()函数在读操作中略去输入中的一个或多 
个空白字符。 
    3. 非空白字符: 一个非空白字符会使scanf()函数在读入时剔除掉与这个非 
空白字符相同的字符。 
    地址表是需要读入的所有变量的地址, 而不是变量本身。这与printf()函数 
完全不同, 要特别注意。各个变量的地址之间同","分开。

#20


这个是不是你们老师出的??
你们老师在整你耶

#21


内存泄漏,如果考虑缓冲区溢出攻击的话还有些价值
要么就是研究C语言内部的结构

#22


内存泄漏,如果考虑缓冲区溢出攻击的话还有些价值 
 

此话怎讲?高手指点

#23


#include<stdio.h>

int main(void) {

char static c1[20],c2;

scanf ("%c%ls",&c1,&c2);
printf("%s;%c\n",c1,c2);
printf("%c",&c1);/* 输出在static下 输出是空的 */

return 0;
}

输入string c
输出
s;t

更改输入&cl也没有改变

如果改成
#include<stdio.h>

int main(void) {

char c1[20],c2;

scanf ("%c%ls",&c1,&c2);
printf("%s;%c\n",c1,c2);
printf("%c",&c1);

return 0;
}
输入string c
输出
 ;t
H

而不用static状态,即使你更改输入 cl的输出还是H

#24


up

#25


好模糊啊

#26


printf("%c",&c1);
------------------------------------
将c1的地址按照字符型显示出来??这会显示什么呢?

#27


好象题不对!

#28


对于LearnAndStudy(c@ini@o) 的回复。。。好象不太懂

#29


哈哈,c1[20]跟c2在内存中是相邻的。一般的编译器会把c2放在低的地址,c1[20]在后面。不用我说结果了吧。

#30


我刚刚学习c,看不懂地说

#31


UP