吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 413|回复: 5
收起左侧

[学习记录] 数组和指针定义字符串的区别

[复制链接]
水逸寒风 发表于 2024-8-29 10:53
本帖最后由 水逸寒风 于 2024-8-29 10:56 编辑

有朋友问为什么以下代码会有错误,应该如何来修改:
[C] 纯文本查看 复制代码
#include "stdio.h"
int main()
{
        char name;
        printf("请输入您的姓名:");
        scanf("%s",&name);
        printf("%s",name);

    return 0;
}


代码中
char name;
scanf("%s", &name);
这两行有问题。
应该修改为:
[C] 纯文本查看 复制代码
char name[30];
scanf("%s", name);        //可以加&也可以不加&


在C语言中,字符串的定义有两种形式,它们分别是:
[C] 纯文本查看 复制代码
        char str1[] = "xingke";        //以数组形式定义
        char *str2 = "xingke";                //以指针形式定义

这两种形式其实是有区别的。第一种形式的字符串所在的内存既有读取权限又有写入权限;第二种形式的字符串所在的内存只有读取权限,没有写入权限。printf()、puts() 等字符串输出函数只要求字符串有读取权限,而 scanf()、gets() 等字符串输入函数要求字符串有写入权限。所以,第一种形式的字符串既可以用于输出函数又可以用于输入函数,而第二种形式的字符串只能用于输出函数。
它们最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区。全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。
内存权限的不同导致的一个明显结果就是,字符数组在定义后可以读取和修改每个字符,而对于第二种形式的字符串,一旦被定义后就只能读取不能修改,任何对它的赋值都是错误的。
我们将第二种形式的字符串称为字符串常量,意思很明显,常量只能读取不能写入。

另外,对于第一种形式的字符串,在[ ]里面要指明字符串的最大长度,如果不指明,也可以根据=后面的字符串来自动推算,此处,就是根据"xingke"的长度来推算的。但是在你的例子中,开始我们只是定义了一个字符串,并没有立即给它赋值,所以没法自动推算,只能手动指明最大长度,这也就是为什么一定要写作char name[30],而不能写作char name[]的原因。补充说明下,[30]只是提前定义了数组长度为30,不一定为30。

这里还要注意“scanf("%s", name);”,这行代码用来输入字符串。scanf() 读取数据时需要的是数据的地址,整数、小数、单个字符都要加&取地址符,这很容易理解;但是对于此处的 name字符串,我们并没有加 &,这是因为,字符串的名字会自动转换为字符串的地址,所以不用再多此一举加 & 了。当然,你也可以加上,这样虽然不会导致错误,但是编译器会产生警告。

至于,字符串的名为什么自动转换为字符串的地址,那就是另外一个问题了。

附原问题来源:
1.png


发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

你好,再见 发表于 2024-8-29 12:39
字符是一个整数,printf("%s",name);当然会出错了
字符数组的名字就是指向第一个元素的指针,所以scanf读入字符串时不用在name前加上&
海水很咸 发表于 2024-8-29 12:44
[C++] 纯文本查看 复制代码
	char name;
	scanf("%c",&name);
	printf("%c",name);

点评

会溢出覆盖堆栈内容。 如果你的输入内容足够大(大概二十个字节应该就能触发了),程序在执行 scanf 后就会崩溃了。  详情 回复 发表于 2024-8-30 05:36
爱飞的猫 发表于 2024-8-30 05:36

会溢出覆盖堆栈内容。
如果你的输入内容足够大(大概二十个字节应该就能触发了),程序在执行 scanf 后就会崩溃了。
michaelgao 发表于 2024-8-30 13:23
char name ---> 姓名大概率不会只是一个ascii码字符,定义成字符串比较好 ---> char name[30] 或 char* name; name=new char[30];
%c ---> 针对单个字符得
%s---> 针对数组的 或 字符串指针的

祝贺一起学习、共同进步。
yes2 发表于 2024-8-30 16:12
讲得不错
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-14 20:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表