为什么C语言Scanf函数对字符串不要加 取地址运算符&

作者&投稿:轩度 (若有异议请与网页底部的电邮联系)
C语言中 用scanf函数输入字符串数组,取地址符&是不用输的,如果输了取地址符算错么 ,或者含义不一样么?~

不一样。
C语言的字符串为数组形式,而数组的名称可以表示其地址,故对字符串输入不需要加地址符。而单独的字符、整型变量等的名称不能直接表示地址,故需要加地址符。数组名就代表了该数组的地址。整个数组是一块连续的内存单元,数组名所代表的地址为第0个元素的地址,c就代表c[0]的地址。
设数组c的首地址为0X2000,也就是说c[0]地址为0X2000,则数组名c就代表这个首地址。因为c已经表示地址,所以在c前面不能再加取地址符&。

字符串数据类型是建模在形式字符串的想法上的数据类型。字符串是几乎在所有编程语言中可以实现的非常重要和有用的数据类型。
扩展资料
为了避免这种情况,可多设几个字符数组分段存放含空格的串。程序可改写如下:
#include
intmain()
{
char str1[20], str2[20], str3[20];
printf("Input string: ");
scanf("%s %s %s %s",str1,str2, str3);
printf("Your string: %s %s %s %s
",str1, str2, str3);
}
运行结果:
Input string: C C++ Java
Your string: C C++ Java

scanf(“格式控制字符串”, 地址表列);
其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。

例如:&a、&b分别表示变量a和变量b的地址。

这个地址就是编译系统在内存中给a、b变量分配的地址。在C语言中,使用了地址这个概念,这是与其它语言不同的。 应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。

变量的地址和变量值的关系
在赋值表达式中给变量赋值,如:
a=567;
则,a为变量名,567是变量的值,&a是变量a的地址。

但在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。

C语言的字符串为数组形式,而数组的名称可以表示其地址,故对字符串输入不需要加地址符。而单独的字符、整型变量等的名称不能直接表示地址,故需要加地址符。

数据类型

字符串数据类型是建模在形式字符串的想法上的数据类型。字符串是几乎在所有编程语言中可以实现的非常重要和有用的数据类型。

在某些语言中它们可作为基本类型获得,在另一些语言中做为复合类型获得。多数高级语言的语法允许通常用某种方式引用起来的字符串来表示字符串数据类型的实例;这种元字符串叫做“文本”或“字符串文本”。

扩展资料

字符串

C语言的字符串其实就是以'\0'字符结尾的char型数组,使用字符型并不需要引用库,但是使用字符串就需要C标准库里面的一些用于对字符串进行操作的函数。它们不同于字符数组。使用这些函数需要引用头文件<string.h>。

文件输入/输出

在C语言中,输入和输出是经由标准库中的一组函数来实现的。在ANSI C中,这些函数被定义在头文件<stdio.h>;中。

标准输入/输出

有三个标准输入/输出是标准I/O库预先定义的:

1、stdin标准输入

2、stdout标准输出

3、stderr输入输出错误

参考资料来源:百度百科-字符串

参考资料来源:百度百科-c语言



字符串名字就代表字符串的首地址,因此不需要加&。

字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的,如s=“abcdefghij”,则s[1]=“b”,s[9]="j",而字符串的零位正是它的长度,如s[0]=10。

在程序设计中,字符串(string)为符号或数值的一个连续序列,如符号串(一串字符)或二进制数字串(一串二进制数字)。

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

依据数组初始化规则,可以把上面的语句写成以下语句:

char greeting[] = "Hello";

扩展资料:

函数应用

1. 连接运算 concat(s1,s2,s3…sn) 相当于s1+s2+s3+…+sn。

例:concat(‘11’,'aa’)='11aa’;

2. 求子串。 Copy(s,I,I) 从字符串s中截取第I个字符开始后的长度为l的子串。

例:copy(‘abdag’,2,3)=’bda’;

3. 删除子串。过程 Delete(s,I,l) 从字符串s中删除第I个字符开始后的长度为l的子串。

例:s:=’abcde’;delete(s,2,3);结果s:=’ae’;

4. 插入子串。 过程Insert(s1,s2,I) 把s1插入到s2的第I个位置。

例:s:=abc;insert(‘12’,s,2);结果s:=’a12bc’;

5. 求字符串长度 length(s) 例:length(‘12abc’)=5。

在ASP中 求字符串长度用 len(s)例: len("abc12")=5。

参考资料:

百度百科-字符串



C语言的字符串实际上是 字符数组.
既然是数组, 那么数组头自然是一个指针.
char str[] = {"abc"};
这个str实际上是一个不可变的字符指针.
scanf的参数要求传入指针. 之后按照格式化字符串对指针指向的地址赋值..
str本身就是一个指针了, 所以不需要&str,
如果&str, 那么得到是就是指针的指针,

scanf并不只是对字符串不加 取地址运算符.
例如 int arr[] = {1, 2, 3};
scanf("%d", arr);
这里对arr照样不需要取地址运算符, 因为arr是数组头, 本身就是一个指针.
上面的语句是对arr数组的第一个元素赋值, 就是arr[0];

当然也可以这么写.
scanf("%d", &arr[0]);
arr[0]是一个值, 并非指针, 于是对其取地址.

对于字符串也可以这么写.
char str[3] ;
scanf("%c", &str[0]);
这是对str的第一个元素赋值也就是 str[0];

不知道你看懂了没有?

C的输入函数是scanf而非Scanf。
C没有字符串变量,字符串是用字符数组处理的。数组的特点是数组名有双重身份:既是数组名又是这个字符串第一个字符的地址,也就是这个字符串的首地址。所以当有char a[10]的声明后,scanf("%s",a)和scanf("%s",&a)都是合法的,前者a是指针身份,后者a是数组名身份;无论早期的C还是现在的C都是认可的。

关注
C语言的字符串为数组形式,而数组的名称可以表示其地址,故对字符串输入不需要加地址符。而单独的字符、整型变量等的名称不能直接表示地址,故需要加地址符。

数据类型

字符串数据类型是建模在形式字符串的想法上的数据类型。字符串是几乎在所有编程语言中可以实现的非常重要和有用的数据类型。

在某些语言中它们可作为基本类型获得,在另一些语言中做为复合类型获得。多数高级语言的语法允许通常用某种方式引用起来的字符串来表示字符串数据类型的实例;这种元字符串叫做“文本”或“字符串文本”。

扩展资料

字符串

C语言的字符串其实就是以'\0'字符结尾的char型数组,使用字符型并不需要引用库,但是使用字符串就需要C标准库里面的一些用于对字符串进行操作的函数。它们不同于字符数组。使用这些函数需要引用头文件<string.h>。

文件输入/输出

在C语言中,输入和输出是经由标准库中的一组函数来实现的。在ANSI C中,这些函数被定义在头文件<stdio.h>;中。

标准输入/输出

有三个标准输入/输出是标准I/O库预先定义的:

1、stdin标准输入

2、stdout标准输出

3、stderr输入输出错误

参考资料来源:百度百科-字符串

参考资料来源:百度百科-c语言

0 7

iiiiiiiipl
2019-06-26

关注
字符串名字就代表字符串的首地址,因此不需要加&。

字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的,如s=“abcdefghij”,则s[1]=“b”,s[9]="j",而字符串的零位正是它的长度,如s[0]=10。

在程序设计中,字符串(string)为符号或数值的一个连续序列,如符号串(一串字符)或二进制数字串(一串二进制数字)。

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

依据数组初始化规则,可以把上面的语句写成以下语句:

char greeting[] = "Hello";

扩展资料:

函数应用

1. 连接运算 concat(s1,s2,s3…sn) 相当于s1+s2+s3+…+sn。

例:concat(‘11’,'aa’)='11aa’;

2. 求子串。 Copy(s,I,I) 从字符串s中截取第I个字符开始后的长度为l的子串。

例:copy(‘abdag’,2,3)=’bda’;

3. 删除子串。过程 Delete(s,I,l) 从字符串s中删除第I个字符开始后的长度为l的子串。

例:s:=’abcde’;delete(s,2,3);结果s:=’ae’;

4. 插入子串。 过程Insert(s1,s2,I) 把s1插入到s2的第I个位置。

例:s:=abc;insert(‘12’,s,2);结果s:=’a12bc’;

5. 求字符串长度 length(s) 例:length(‘12abc’)=5。

在ASP中 求字符串长度用 len(s)例: len("abc12")=5。

参考资料:

百度百科-字符串

0 1

匿名用户
2020-09-08

python编程入门,科大讯飞资深讲师线上授课,拥有多年实战经验。从入门到实战进阶课程限时免费,还有更多免费课程java,机器学习等就在讯飞AI大学 点击进入详情页
广告

White_MouseYBZ
2013-02-08

关注
C的输入函数是scanf而非Scanf。
C没有字符串变量,字符串是用字符数组处理的。数组的特点是数组名有双重身份:既是数组名又是这个字符串第一个字符的地址,也就是这个字符串的首地址。所以当有char a[10]的声明后,scanf("%s",a)和scanf("%s",&a)都是合法的,前者a是指针身份,后者a是数组名身份;无论早期的C还是现在的C都是认可的。
2 123

OverSeven
2013-02-08

关注
因为字符串 名本身就是一个指针。 如: char a[100]; a就是指针,指向数组首地址。
而 int a; a 是整形变量,要用scanf来读取数据放入 内存, 要访问内存区域,要通过地址来访问
所以要加上&, 通过&a来访问内存区域。
0 6

落单毛毛虫
2013-02-08

关注
C语言的字符串实际上是 字符数组.
既然是数组, 那么数组头自然是一个指针.
char str[] = {"abc"};
这个str实际上是一个不可变的字符指针.
scanf的参数要求传入指针. 之后按照格式化字符串对指针指向的地址赋值..
str本身就是一个指针了, 所以不需要&str,
如果&str, 那么得到是就是指针的指针,
scanf并不只是对字符串不加 取地址运算符.
例如 int arr[] = {1, 2, 3};
scanf("%d", arr);
这里对arr照样不需要取地址运算符, 因为arr是数组头, 本身就是一个指针.
上面的语句是对arr数组的第一个元素赋值, 就是arr[0];
当然也可以这么写.
scanf("%d", &arr[0]);
arr[0]是一个值, 并非指针, 于是对其取地址.
对于字符串也可以这么写.
char str[3] ;
scanf("%c", &str[0]);
这是对str的第一个元素赋值也就是 str[0];
不知道你看懂了没有?
1 赞赏 191
完成点赞任务,奖励10财富值

加入战队答题,平均奖励翻1.5倍

赚财富值

stelika
2013-02-08

关注
因为scanf要获取变量的地址才能把读到的内容存放在这个变量里
你说的字符串是c风格字符串,c风格字符串变量本身就是这个字符串的首地址,所以无需加&
1 6

l521088816
2013-02-08

关注
字符串的变量名称就是这个字符串的首地址了
既然已经是地址了,就不用再取地址了
0 1

匿名用户
2013-02-08

因为字符串 char *str:本身就是指针变量
0 3

非常老L
2013-02-08

关注
编译器认为字符串代表地址。
0 3
python编程入门学习_免费视频教程_从入门到实战。
关注编程的都在看
python编程入门,科大讯飞资深讲师线上授课,拥有多年实战经验。从入门到实战进阶课..
科大讯飞股份有限公司广告
.c语言培训,0基础学游戏U3D,月薪高
根据文中提到的c语言为您推荐
火星学习c语言培训,游戏U3D编程师就业薪资高,毕业=高薪就业,0基础学习,半年即可..
北京火星时代科技有限公司广告
编程-学完就业!
关注编程的都在看
武汉北大青鸟编程入学签就业协议,,免费试读
武汉宏鹏职业培训学校广告

百度APP
有事搜一搜 没事看一看
立即下载
为您推荐
C语言中 用scanf函数输入字符串数组,取地址符&是不用输的,如果输了取地址符算错么 ,或者含义不一样么?
不一样。 C语言的字符串为数组形式,而数组的名称可以表示其地址,故对字符串输入不需要加地址符。而单独

5 浏览4453

c语言中为什么printf输出变量值的时候不要加地址符&,而scanf中却要加上
这是因为使用C语言定义的标准函数,c语言开发时就这么规定的,没有太多的为什么(当初开发C语言的时候也

9 浏览3026

c语言 scanf();为什么要用取地址符
因为scanf这个函数要求的参数传递的是地址!! 函数原型: int scanf(const cha

95 浏览6129

为何在C语言中的scanf()中要用到取地址符,而printf()中却不用?
真正有兴趣的话,可以看看能否找到printf和scanf的源码实现,这样就清楚了。

2 浏览2852

为什么在C语言中,用scanf输入字符串时,不需加&
因为字符串变量名在 scanf 语句里 表示指针 (地址) 例如: char s[80]; s

69 浏览8205 2017-11-22
scanf函数

什么是scanf函数,它在程序中有什么作用

57个问题1,465,886人浏览

龙族神途电脑版_20全新版本
m.99st.com广告
编程-武汉北大青鸟宏鹏校区!
最近2小时前有人咨询相关问题
点击咨询了解更多详情
咨询
m.whhpaccp.com广告
正在加载
向网友提问
十分钟内有问必答
立即下载
董升dig__的知道 退出 反馈 申诉
电脑版 ©2020 Baidu

京ICP证030173号-1 京网文【2013】0934-983号


c语言 {int a【10】,*p,*s; for(p=a;p—a<10;p++) scantf(
int a[10] , *p , *s;\/*定义 数据a[10] , 算计给数组a分配10个连续的地址空间;定义指针 *P 和 *s;*\/ for(p=a;p—a<10;p++) scantf(“%d”,p);\/*将数组的头地址分配给指针p , a-p 为数组下标号即下标小于10时执行scantf(“%d”,p)给数组手动符值 ,执行完该语句后p指针...

c语言中要定义一个一维数组a[n];想用scangf输入n的值,也就是说啊a[n...
include<stdio.h> void main(){ int i=0;int n=0;int a[1000]={0};printf("请输入学生的个数:\\n");scanf("%d",&n);printf("请输入%d个学生各自的成绩:\\n",n);for (i=0;i<n;i++)scanf("%d",&a[i]);printf("打印%d个学生各自的成绩: \\n",n);for (i=0;i<n;i++...

c语言中scanf和int谁在前
int为integer的缩写,用于声明变量、函数等,如:int a, b[3];int *c;int main(){ return 0;} 等。若是变量类别的,代表该变量或数组中的一个元素的长度为2字节(因编译器而异),储存数据范围为-32768~32767;而对于声明函数,int表示函数的返回值为在前述范围中的整数。scanf是scan format ...

c语言中“&”后加一个字母是什么意思
&是取地址符,后面取变量地址。scan输出函数里必须要用到&取地址符。数组也要用,再学深入点就明白了,不难

我需要用C++程序做的Nstep-scan
printf(" ║ 4.循环扫描算法(CSCAN) ║\\n"); printf(" ║ ║\\n"); printf(" ║ 5.N步扫描算法(NStepScan) ║\\n"); printf(" ║ ║\\n"); printf(" ║ 6.各类算法的比较 ║\\n"); printf(" ║ ║\\n"); printf(" ║ ║\\n"); printf(" ║ ╭———╮ ║\\n"); printf(" ╰═┤...

c语言求任意输10个数里相邻3个数的和
include<stdio.h> main(){ int i,n;float sum=0,a[10];printf("请输入10个整数!\\n");for(;i<10;i++)sacnf("%d",&a[i]);while(n!=-1){ printf("请输入第几个数求相邻数和\\n");scan("%d",&n);if(n==0){um=a[0]+a[1]+a[2];printf("%d+%d+%d=%d\\n",a[0],...

C语言中,什么时候该用float、int、printf、scanf
按英文字面意思来理解。float:浮点,就是对应我们在数学中的小数;int:integer,整数。printf = print(打印)+f(function 函数),就是打印函数,输出到屏幕上,输出函数;scanf= scan(扫描)+f(function 函数),扫描函数,就是外面的东东扫描到电脑里面,作为输入,就是输入函数。

关于单片机c语言4*4小键盘程序
借用一下你的程序~char keypad_scan(){ char key,i;P2=0xf0; \/\/定义高四位输出,低四位输入 while(P2!=0xf0) ; \/\/等待按键按下 do { for(i=0;i<3;i++){ P2=ksp[i]; \/\/扫描出是哪一行(列) -->但错了,变成赋值运算了~if(P2!=ksp[i]) \/\/扫描出是哪一列(行) ...

请问C语言中scanf函数里的%5c 的意思是不是用来输出5个字符?
确实是5个字符,但这个字符是空白符,通常这是作用是用来对齐的,%5c,那么前面4个为空格,第5个为你转义的字符,%-5c则相反,第一个为你转义的字符,后4个为空白符。这种同样适用%5d,%-5d等,例如%5d,输出的数为123,则前面2个为空格加123;若输出的数为12345,则就输出12345,保持原样 ...

C语言中scanf格式符[scanlist]什么作用?举个小例子。
int m, n, p;scanf("%d %d %d", &m, &n, &p);~~~

江山市18784092883: 为什么C语言Scanf函数对字符串不要加 取地址运算符& -
依真盐酸: C语言的字符串为数组形式,而数组的名称可以表示其地址,故对字符串输入不需要加地址符.而单独的字符、整型变量等的名称不能直接表示地址,故需要加地址符. 数据类型 字符串数据类型是建模在形式字符串的想法上的数据类型.字符...

江山市18784092883: c语言 scanf();为什么要用取地址符 -
依真盐酸: scanf(“格式控制字符串”, 地址表列); 其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串.地址表列中给出各变量的地址.地址是由地址运算符“&”后跟变量名组成的.例如:&a、&b...

江山市18784092883: c语言 scanf为什么要用&来取地址 -
依真盐酸: 因为scanf要往你的变量里写入数值,所以他必须知道那个变量的地址,至于变量里存的是什么值,他百是不管的,反正他写入之后就被覆盖成新的值了 对比printf,他是要输出变量里的数值,他只管要那个值,至于地址在哪,他也无所谓 这就是...

江山市18784092883: 为什么在C语言中,字符型不能用SCANF输入,而是用GETCHAR? -
依真盐酸: 楼主你好,关于你问的这个问题在我初学C语言的时候也遇到过,不仅是一个人遇到,这是很多初学者都会遇到的问题~,当然,我不是说楼主大哥你是初学者~~~呵呵~~~~~~~这个问题曾经麻痹了很多人,开始我也是不知道是什么原因,直到一...

江山市18784092883: scanf中输出字符串为什么不能显示 -
依真盐酸: scanf在对于%s输入时,遇到空格或者回车,就停止对字符串的输入了.也就是说,通过scanf你不会把空格或者字符串输入到字符串中的.

江山市18784092883: C语言里为什么fgets很少用? -
依真盐酸: 因为fgets函数只能输入字符串,而Scanf()能输入多种类型的数据,加上一般的C语言教材往往重视讲授原理,而对程序健壮性、异常处理等考虑不多,所以一般资料很少提及fgets函数. scanf在获取用户输入的字符串时,遇到空格、制表符即...

江山市18784092883: C语言中 为什么用scanf在给 数组和字符数组赋值是 数组要加& 而字符串却不加& -
依真盐酸: 可以从scanf函数的函数原型来进行解释.函数原型:int scanf(char *format, args, ...); 功 能:从标准输入设备按format指定的输入格式将数据输入到args所指向的内存单元 返 回 值:读入并赋给args的数据个数.遇文件结束返回EOF,出错返...

江山市18784092883: 问一下C语言scanf的题 这道题为什么不能用scanf输入字符串? 是根本就不可以,还是这题不行 -
依真盐酸: 当scanf读字符串的时候,空格是scanf的终止符,即读到空格scanf函数就会结束

江山市18784092883: C语言中关于字符数组输入,scanf为什么没执行 -
依真盐酸: 这个算是比较典型的错误的 用scanf来接收字符串,最后的回车符不会被接收,留在缓冲区,下一次再用scanf时,从回车符开始接收,所以ch接收到的字符是回车符,解决方法是,在scanf("%c",&ch);上面加上一条语句:getchar();修改后的代码类似如下:......printf("请输入要查找的字符:"); getchar(); //加上这条语句,消耗缓冲区的回车符. scanf("%c",&ch);......

江山市18784092883: scanf("%f",&f)为啥要加& -
依真盐酸: &为取地址运算符,如果是普通变量,必须用,如果不用,则无法赋值,示例如下: int a;scanf("%d",&a); 如果为数组、指针或字符串,就要看情况了: int a,*p;p=&a;scanf("%d",p);

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网