鱼C论坛

 找回密码
 立即注册
查看: 1712|回复: 16

[已解决]str[20]和20[str]

[复制链接]
发表于 2023-10-3 16:23:27 | 显示全部楼层 |阅读模式

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

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

x
代码
#include <stdio.h>

int main() {
  char str[] = "I love FishC.com!What about your?";

  printf("%s \n%s\n", str[20], 20 [str]);

  return 0;
}
小甲鱼原话:
2. 请问 str[20] 是否可以写成 20[str]?
答:可以。

结果:
gcc test5.c && ./a.out
段错误 (核心已转储)
有哪位鱼油可以解释一下吗?
最佳答案
2023-10-3 16:23:35
这段代码的问题出在printf函数的参数中。str[20]和20[str]都是单个字符,但是在printf函数的参数中使用了%s,它会尝试输出一个字符串,因此会出现段错误。

str[20]表示字符串str中下标为20的字符,而20[str]也可以表示相同的字符,因为在C语言中,str[20]等价于*(str+20),而20[str]等价于*(20+str),由于加法满足交换律,因此它们都可以表示字符串str中下标为20的字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-3 16:23:35 | 显示全部楼层    本楼为最佳答案   
这段代码的问题出在printf函数的参数中。str[20]和20[str]都是单个字符,但是在printf函数的参数中使用了%s,它会尝试输出一个字符串,因此会出现段错误。

str[20]表示字符串str中下标为20的字符,而20[str]也可以表示相同的字符,因为在C语言中,str[20]等价于*(str+20),而20[str]等价于*(20+str),由于加法满足交换律,因此它们都可以表示字符串str中下标为20的字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-3 16:24:10 | 显示全部楼层
首先,我们来解释一下代码中的两个表达式:str20[str]

在 C 语言中,数组下标运算符 [] 的实际工作原理是通过指针运算来实现的。当我们使用 str 时,实际上是在执行 *(str + 20)。同样,20[str] 实际上是在执行 *(20 + str)。由于加法运算是可交换的,所以这两个表达式是等价的。

然而,这段代码中存在一个问题,导致了段错误(segmentation fault)。段错误通常是由于程序试图访问非法内存区域而引发的。在这个例子中,str 是一个字符数组,其长度为 25(包括空字符 '\\0')。当我们尝试访问 str20[str] 时,我们实际上是在访问数组范围之外的内存,这可能导致段错误。

此外,printf 函数的格式字符串中使用了 %s,它期望接收一个以空字符 '\\0' 结尾的字符串指针。但是,str20[str] 都是字符类型(char),而不是字符串指针。这也可能导致未定义行为和段错误。

为了解决这个问题,你可以将代码修改为:
#include <stdio.h>

int main() {
    char str[] = "I love FishC.com!What about your?";
    printf("%c \
%c\
", str[20], 20 [str]);
    return 0;
}

这里,我们将 printf 的格式字符串中的 %s 改为 %c,以便正确地输出字符。这样,程序应该可以正常运行并输出两个字符。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-3 16:24:22 | 显示全部楼层
isdkz 发表于 2023-10-3 16:23
这段代码的问题出在printf函数的参数中。str[20]和20[str]都是单个字符,但是在printf函数的参数中使用了%s ...

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

使用道具 举报

 楼主| 发表于 2023-10-3 16:25:19 | 显示全部楼层
isdkz 发表于 2023-10-3 16:23
这段代码的问题出在printf函数的参数中。str[20]和20[str]都是单个字符,但是在printf函数的参数中使用了%s ...

抱歉,看到str就打了个%s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-3 16:27:07 | 显示全部楼层
陶远航 发表于 2023-10-3 16:24
首先,我们来解释一下代码中的两个表达式:str 和 20[str]。

在 C 语言中,数组下标运算符 [] 的实际工 ...


感谢你的回答
——但为什么我没看到!!!
诶,也对只有刷新才看得到......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-3 16:27:48 | 显示全部楼层
风眠 发表于 2023-10-3 16:27
感谢你的回答
——但为什么我没看到!!!
诶,也对只有刷新才看得到......{:10 ...

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

使用道具 举报

 楼主| 发表于 2023-10-3 16:29:17 | 显示全部楼层

对了为什么我收到了提示
屏蔽3 分钟前
Mike_python小 回复了您的帖子 str[20]和20[str]   查看
但我这儿看不到他的消息呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-3 16:30:05 | 显示全部楼层
风眠 发表于 2023-10-3 16:29
对了为什么我收到了提示
但我这儿看不到他的消息呢?

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

使用道具 举报

 楼主| 发表于 2023-10-3 16:31:43 | 显示全部楼层
这个:
2023-10-03-163030_1600x900_scrot.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-3 16:32:14 | 显示全部楼层
算BUG吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-3 16:33:26 | 显示全部楼层

他脚本没调试好吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-3 16:34:03 | 显示全部楼层
陶远航 发表于 2023-10-3 16:33
他脚本没调试好吧

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

使用道具 举报

发表于 2023-10-3 16:34:56 | 显示全部楼层

没事,就是一个Bug而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-3 16:37:12 | 显示全部楼层
好的,已经去问了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-3 16:51:13 | 显示全部楼层
风眠 发表于 2023-10-3 16:37
好的,已经去问了

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

使用道具 举报

发表于 2023-10-3 16:58:52 | 显示全部楼层

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 21:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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