scanf(“%s“,str);与scanf(“%s“,&str的理解

Posted (Morgan)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scanf(“%s“,str);与scanf(“%s“,&str的理解相关的知识,希望对你有一定的参考价值。

目录

1.scanf的理解

scanf和wscanf都返回成功转换和分配的字段的数量;返回值不包括已读取但未赋值的字段。返回值为0表示没有分配字段。如果出现错误,或者在第一次尝试读取字符时遇到文件结束符或字符串结束符,则返回值为EOF。

2.关于有&和没有&的区别

会发现&a的是直接加了个整体(10个字节),而a或a[0](为一个字节)
如图

3.为什么scanf(“%s”,str);和scanf(“%s”,&str);输出是一样的?

对数组来说a数组首元素的地址和&a都指向数组的首地址,这两个地址值上来说一样。主要原应为是scanf和wscanf都返回成功转换和分配的字段的数量通俗来讲scanf接收一长串字符后,都按这个地址一一往后填字符所以说它们输出的是一样的。
————————————————————————————————————————————
(希望各位大佬可以指出我的问题谢谢)

scanf函数输入字符串详解

除了在定义字符数组时初始化外,还可以通过scanf从键盘输入字符串。下面写一个程序:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 int main(void)
 4 {
 5     char str[10];//str是string的缩写,即字符串
 6     printf("请输入字符串:");
 7     scanf("%s",str);//输入参数是已经定义好的"字符数组名",不用加&,因为在C语言中数组名就代表该数组的起始地址
 8     printf("输出结果:%s
",str);
 9     return 0;
10 }

技术分享图片

用 scanf 给字符数组赋值不同于对数值型数组赋值。前面讲过,给数值型数组赋值时只能用 for 循环一个一个地赋值,不能整体赋值。而给字符数组赋值时可以直接赋值,不需要使用循环。此外从键盘输入后,系统会自动在最后添加结束标志符 ‘‘。但是用 scanf 输入字符串时有一个地方需要注意:如果输入的字符串中带空格,比如“i love you”,那么就会有一个问题。我们将上面程序运行时输入的字符串改一下:

 
1 # include <stdio.h>
2 int main(void)
3 {
4     char str[10];  //str是string的缩写, 即字符串
5     printf("请输入字符串:");
6     scanf("%s", str);  //输入参数是已经定义好的字符数组名
7     printf("输出结果:%s
", str);
8     return 0;
9 }

技术分享图片

我们看到,输入的是“i love you”,而输出的只有“i”。原因是系统将空格作为输入字符串之间的分隔符。也就是说,只要一“敲”空格,系统就认为当前的字符串已经结束,接下来输入的是下一个字符串,所以只会将空格之前的字符串存储到定义好的字符数组中。

那么这种情况该怎么办?那么就以空格为分隔符,数数有多少个字符串,有多少个字符串就定义多少个字符数组。比如“i love you”有两个空格,表示有三个字符串,那么就定义三个字符数组:
 
1 #include <stdio.h>
2 int main(void)
3 {
4     char str1[10],str2[10],str3[10];
5     printf("请输入字符串:");
6     scanf("%s%s%s",str1,str2,str3);
7     printf("输出结果:%s %s %s
",str1,str2,str3);//%s间要加空格
8     return 0;
9 }
技术分享图片
需要注意的是,前面讲“清空缓冲区”的时候讲过,用 scanf 输入时,不管输入什么,最后“敲”的回车都会被留在缓冲区,这里也不例外。输入字符串时最后“敲”的回车也会被留在缓冲区,如果紧接着要给一个字符变量赋值的话,那么还没等你输入系统就自动退出来了。因为系统自动将回车产生的字符 ‘ ‘ 赋给该字符变量了,所以此时对字符变量赋值前要首先清空缓冲区。
 

以上是关于scanf(“%s“,str);与scanf(“%s“,&str的理解的主要内容,如果未能解决你的问题,请参考以下文章

scanf 时与 char 数组混淆

字符串的输入scanf 和gets

c语言中怎样用scanf()读入带空格的字符串

c++接收问题为何cin能接收,scanf接收就出错?

scanf()和printf()输入输出string类型

C忽略scanf上的破折号