鱼C论坛

 找回密码
 立即注册
查看: 87|回复: 6

[已解决]程序与答案所给一致但无法输出

[复制链接]
发表于 2024-8-28 22:31:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
字符与字符串一课的课后作业最后一题
最佳答案
2024-8-29 10:41:57
本帖最后由 行客 于 2024-8-29 11:00 编辑

char name;
scanf("%s", &name);
这两行有问题。
应该修改为:
char name[30];
scanf("%s", name);        //可以加&也可以不加&

在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字符串,我们并没有加 &,这是因为,字符串的名字会自动转换为字符串的地址,所以不用再多此一举加 & 了。当然,你也可以加上,这样虽然不会导致错误,但是编译器会产生警告。

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

屏幕截图 2024-08-28 223027.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-28 22:43:46 | 显示全部楼层
首先,你这字体怎么回事?
另外,你凭什么说这个代码和答案一样?
既然一样,为什么你的代码运行不出期望的结果?
当然是两个代码不一样了,这样运行出的结果才不一样

你一个字符一个字符检查过代码了?就敢说两个代码一样?
这个代码你是复制粘贴的?如果是复制粘贴的,那就可以说一样,当然也要检查一下是不是复制粘贴的时候弄错了,这样你才能说两个代码一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-28 22:44:18 | 显示全部楼层
当然,我愿意帮助你解决这个问题。为了更好地解答,请你详细描述一下程序的内容和具体的错误或问题,这样我可以给出更针对性的建议。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-28 22:46:10 | 显示全部楼层
看一看第8行
scanf("%s", &name); 这个是不是错了

另外,看一看第4行
char name; 这个是不是错了

非常认真的检查代码,一个字符一个字符的和答案对照一下,看看还有哪些字符不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-29 05:32:42 | 显示全部楼层
这个字体你居然受得了……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-29 07:22:17 From FishC Mobile | 显示全部楼层
char name;
scanf("%s", &name);
这两行有问题

另外,什么逆天字体,赶紧换一个吧,看着难受
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-29 10:41:57 | 显示全部楼层    本楼为最佳答案   
本帖最后由 行客 于 2024-8-29 11:00 编辑

char name;
scanf("%s", &name);
这两行有问题。
应该修改为:
char name[30];
scanf("%s", name);        //可以加&也可以不加&

在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字符串,我们并没有加 &,这是因为,字符串的名字会自动转换为字符串的地址,所以不用再多此一举加 & 了。当然,你也可以加上,这样虽然不会导致错误,但是编译器会产生警告。

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-17 03:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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