鱼C论坛

 找回密码
 立即注册
查看: 2134|回复: 7

Linux C语言基础问题

[复制链接]
发表于 2016-5-2 15:27:41 | 显示全部楼层 |阅读模式
10鱼币
#include <stdio.h>
int main(){
        char a='c';
        char b[]="efgchij";
        long d=strchr(b,a);
        printf("%ld\n",d);
        return 0;
}

将 b 定义为数组时,结果为不确定值的负整数
但将 b 定义为 字符串指针,结果就是固定的 正整数
请讲解一下原理

最佳答案

查看完整内容

首先,应该包含头文件 其次,strchr(char*,char)函数返回的为char*, long d=strchr(b,a); 改为 char *p=strchr(b,a); 如果计算字符在字符串中的位置, long d=p-b; 最后用printf()函数输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-2 15:27:42 | 显示全部楼层
首先,应该包含头文件<string.h>
其次,strchr(char*,char)函数返回的为char*,
long d=strchr(b,a); 改为 char *p=strchr(b,a);
如果计算字符在字符串中的位置,
long d=p-b;
最后用printf()函数输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-2 16:48:30 | 显示全部楼层
问题不对的,b不是出错的重点。
“long d=strchr(b,a);”这句应该有编译时警告的(类型不同),或者是编译器睡着了。
printf()打印的d来自strchar()函数的返回值。
strchar()的函数功能:查找指定字符(变量a)在目标字符串(变量b)中出现的首位置,并返回指向该位置的指针(a在b中首次出现时的内存地址)。
所以d应该声明为char *类型的字符指针:
char * d = strchr(b,a);
printf("%p",d);语句打印了指针d的值(a所在的内存地址),指针的格式说明符是%p(编译器不支持时用%u或者%lu)
至于b,它实际上表示了存储在数据段的字符串的内存地址(是个地址常量),而且字符串是程序执行期间一直存在的)。更多的就建议看看有关字符串的C基础。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-5-2 17:39:18 | 显示全部楼层
mingcxx 发表于 2016-5-2 16:48
问题不对的,b不是出错的重点。
“long d=strchr(b,a);”这句应该有编译时警告的(类型不同),或者是编译 ...

或许大部分东西你都说对了,但我最想知道的答案仍然没说清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-2 18:43:47 | 显示全部楼层
dt3tc 发表于 2016-5-2 17:39
或许大部分东西你都说对了,但我最想知道的答案仍然没说清楚

先提醒一下strchar()的函数原型,没有包含string.h文件时,编译器无法找到这个函数。编译时你又忽略了警告。所以运行起来后,找不到位置的strchar()函数,d被随机分配一个值。至于随机负数和固定正数,我觉得应该不是b的原因,而是不同编译器的处理不同。比如我用的vs2013,在忽略了它的警告之后,我把错误的代码调试运行,试了1.b为数组,2.b为指针,3.包含头文件string.h 且 b为数组,4包含头文件string.h 且 b为指针;有连续3到6次左右出现相同7或8位的正数,继续调试就又变了。在我看来这就是编译器的处理了,它对错误的代码编译,出现了未知的结果,要继续了解恐怕得放下C语言去学编译原理之类的了。而且百度你所要的答案我也没找到。C Primer Plus也没说过这个“答案”。连百度都没法尽快找到和C Primer Plus都回答不了的问题,那我也无能为力了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-17 21:51:36 | 显示全部楼层
不懂  在努力学习中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-21 01:28:52 | 显示全部楼层
指针是变量,字符数组是一种指针类型而已,而且是常量。每次运行你的内存会进栈出栈,所以会不同正整数。但是指针的话就存放的是变量地址,所以总能找到字符。所以不变,这是我的猜测而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-1-10 08:53:41 | 显示全部楼层
zerco 发表于 2016-5-21 01:28
指针是变量,字符数组是一种指针类型而已,而且是常量。每次运行你的内存会进栈出栈,所以会不同正整数。但 ...

3q
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 19:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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