请教一个c语言完数问题问题

后使用快捷导航没有帐号?
查看: 1976|回复: 7
在研究STM32F429时用到了字符串操作,本人C语言功底不好,有个C语言问题请教大家一下
在线时间453 小时
威望746 分
芯币697 枚
TA的帖子TA的资源
纯净的硅(初级), 积分 746, 距离下一级还需 54 积分
纯净的硅(初级), 积分 746, 距离下一级还需 54 积分
u8 *Get_String(u8 *string,u8 position,u8 length)
&&u8 *p=“12345”,i;
&&for(i=0;i&i++)
& & if(string[i+position])
& & p[i]=string[i+position];
& &p[i]='\0';
printf(&%s&,p);
这个函数是在字符串string 的position位置上提出长度为length 的字符串,通过P返回,可是发现P始终指向了“12345”,即使在这个函数内部输出P(就像第10行所示),仍然输出12345, p[i]=string[i+position]这一句仿佛没起到作用,请问大家这是什么情况,请大家不吝赐教,
另外static int *p 和int static *p具体区别是不是分别代表地址里的值是静态的和地址是静态的?
&&&&&&&&&&
在线时间2645 小时
威望5710 分
芯币8191 枚
E金币297 枚
TA的帖子TA的资源
u8 *p=“12345”
改成u8 p[20];之类的。
你的指针p指向只读区域,所以你更改不了。改成数组就可以随便更改了。
但是更改之后,逻辑上也是错误的,局部数组是不能作为返回值返回的,返回之后就失效了。所以你要好好规划一下你的函数。另外,还要判断数组越界的问题,否则很容易就崩溃了。
谭浩强的C语言书上有讲过这个问题吗&
受教了,谢谢&
欢迎加入eeworld QQ水群:(EEWORLD开发板置换) 加群暗号:xinxin的女王
在线时间922 小时
威望2457 分
芯币11914 枚
E金币717 枚
TA的帖子TA的资源
五彩晶圆(初级), 积分 2457, 距离下一级还需 1043 积分
五彩晶圆(初级), 积分 2457, 距离下一级还需 1043 积分
u8 *p=“12345”,C语言中字符串都是以常量的形式存储,也就是只能读取,不能修改,指针P实际上是指向这个常量,所以指针p指向的内容是不变的。你这个函数应该是要提取出输入字符串中给定长度的字符,你可以把p改为一个全局的数组,否则返回的值是不对的
受教了,谢谢&
在线时间453 小时
威望746 分
芯币697 枚
TA的帖子TA的资源
纯净的硅(初级), 积分 746, 距离下一级还需 54 积分
纯净的硅(初级), 积分 746, 距离下一级还需 54 积分
u8 *p=“12345”
改成u8 p[20];之类的。
你的指针p指向只读区域,所以你更改不了。改成数组就可以随便更 ...
受教了,谢谢
在线时间453 小时
威望746 分
芯币697 枚
TA的帖子TA的资源
纯净的硅(初级), 积分 746, 距离下一级还需 54 积分
纯净的硅(初级), 积分 746, 距离下一级还需 54 积分
u8 *p=“12345”,C语言中字符串都是以常量的形式存储,也就是只能读取,不能修改,指针P实际上是指向这个常 ...
受教了,谢谢
在线时间453 小时
威望746 分
芯币697 枚
TA的帖子TA的资源
纯净的硅(初级), 积分 746, 距离下一级还需 54 积分
纯净的硅(初级), 积分 746, 距离下一级还需 54 积分
u8 *p=“12345”
改成u8 p[20];之类的。
你的指针p指向只读区域,所以你更改不了。改成数组就可以随便更 ...
谭浩强的C语言书上有讲过这个问题吗
没看过谭浩强的书,建议多看几本C方面的经典书籍,巩固下基础。&
在线时间2645 小时
威望5710 分
芯币8191 枚
E金币297 枚
TA的帖子TA的资源
谭浩强的C语言书上有讲过这个问题吗
没看过谭浩强的书,建议多看几本C方面的经典书籍,巩固下基础。
欢迎加入eeworld QQ水群:(EEWORLD开发板置换) 加群暗号:xinxin的女王
在线时间453 小时
威望746 分
芯币697 枚
TA的帖子TA的资源
纯净的硅(初级), 积分 746, 距离下一级还需 54 积分
纯净的硅(初级), 积分 746, 距离下一级还需 54 积分
没看过谭浩强的书,建议多看几本C方面的经典书籍,巩固下基础。
Powered by
逛了这许久,何不进去瞧瞧?对于C语言头文件有很多不懂,特来请教_c语言吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:437,798贴子:
对于C语言头文件有很多不懂,特来请教收藏
其实,完全不懂,头文件是什么? 后缀.h文件来的,就是把后缀.c文件窜起来?怎么窜?
福利不只是穿多穿少,还要有迷人的微笑!
你就理解头文件是个工具箱,用到相关工具的时候要带工具箱才能用,比如输入输出语句包含在stdio.h 这个头文件里,怎么串?你就当做是个函数或者是个类就好了,不懂你知不知道我在说什么
就是,,可以这样理解,函数都是需要定义的啊,,比如你用到一个函数printf(),这个函数的定义就包含在stdio.h文件中,有一个文件夹专门放这种.h的后缀文件,你可以自行下载.h文件进行函数扩充。你写的程序中如果用到了某个文件中的某个函数,就要在最开头把他写出来,就是#include&stdio.h&。比如你用到了sum()函数,,就要把包含sum函数定义的math.h文件写出来,让机器进行预处理~#include&math.h&~否则math函数就不能用。大概能懂吧~我也是新手,一起学习一起进步~
那我打个比方吧。首先我不懂怎么创造头文件,如果有错请指点。首先第一一个头文件.h(函数)int max(int a int b)z=a&b?;a:b;return 然后在另外一个文件使用#include&stdio.h&#include&max.h&void main(){int x,y;x=3;y=5;q=max(x,y);printf("%d\n",q);}就这样字用吗?
声明的集合
—走过你走过的路,看着你看过的景,你远去的背影,让我明白时差就是我和你之间永不相交的距离...
头文件是编译链接时第一访问的地方,只有做好充分的准备,才会进入函数中。当然你如果不用头文件也可以,你完全可以编写自己的函数。没有头文件,你连printf都要自己编写。头文件的作用是告诉你你用的某一个函数在库中存在着。一个函数内,没有头文件,就只能用到能够使编辑界面变色的那种关键字,和+-*/等这种运算符,什么scanf(),printf()统统不能够用。如果你认识了函数,你会知道函数是先声明才能在main函数中使用的。正是如此,你要声明函数,在main函数前面。c语言制定规则的时候,想到好多函数大家都要用,不能让程序员一次又一次的编写,所以他们想到做一个程序的仓库,如果程序员要用到,就到仓库中寻找,这样省下好多事,这个仓库就是c标准库。里面的函数就是库函数。要建立仓库,就避免不了将这些库函数放到一些其他的文件内,要不然你每次打开一个工程文件有成千上万的代码,你看着不头痛吗?所以就有了多文件编程,将一个项目的函数分到不同的文件中,这样就有了一个问题,不同文件之间相互调用,大家需要知道在哪里找到要寻找的文件,于是就在第一个函数前面写上了好多被调用的函数的路径,地址,问题又来了,这么多访问路径,经常就重复了,怎么办啊 ?聪明的程序设计者就有将这些访问路径神马的放到了另外一个文件中,大家都去问这个路径要自己所需要函数的路径就好了。这样,就出现了头文件,头文件的意思就是出现在第一个函数之前的东西都可以放到头文件中。
你比如说是有一个a.c文件int main(){add(a,b);}这个a.c文件有一个add()函数,函数在b.c中b.cint add(int a , int b){}a.c 的文件要调用b.c的add,但是它本身不知道b.c在什么地方所以要有一个告诉他路径的文件。x.h#ifndef __X_H__#define __X_H__int add(int a, int b);#endif上面是头文件,x.h中的东西。有了这个头文件,你就可以像使用printf()函数时要加#include &stdio.h&那样吧x.h加到a.c当中了,加的时候要用#include "x.h"这样你的 main函数就知道在当前这个文件夹下,有一个函数是int add(int ,int);的了。
7楼给你一个标准的头文件书写方式,如果还不会就加我qq+我教你,保准你会了
在程序预编译的时候,会吧你程序包含头文件的地方换成头文件的内容,就是预处理,然后在进行编译。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或请教一个C语言顺序点的问题。。。。 - 开源中国社区
当前访客身份:游客 [
当前位置:
各位大神,小生才疏学浅请教一个c语言顺序点问题,代码如下:
#include “stdio.h”
void f(int i,int j)
printf(&%d ,%d
int main()
根据顺序点的知识,为什么k传入的值是2,而k++传入的值是1?小生编译器是gcc,是因为编译器不同,顺序就运算顺序就不同吗?
共有8个答案
<span class="a_vote_num" id="a_vote_num_
参数入栈顺序是和具体编译器实现相关的。
C方式参数入栈顺序(从右至左)的好处就是可以动态变化参数个数。通过栈堆分析可知,自左向右的入栈方式,最前面的参数被压在栈底。除非知道参数个数,否则是无法通过栈指针的相对位移求得最左边的参数。这样就变成了左边参数的个数不确定,正好和动态参数个数的方向相反。
因此,C语言函数参数采用自右向左的入栈顺序,主要原因是为了支持可变长参数形式。
--- 共有 1 条评论 ---
可以在深入解释下:动态变化参数个数
(2年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
k++是指先运行表达式,再加1; k先赋值给方法,然后加1,然后k值变成了2,然后k再赋值给函数,最后调用函数,所以有先2后1的输出。 核心细节 可能 是表达式计算用的先进后出
<span class="a_vote_num" id="a_vote_num_
仅供参考!不一定对喃!
<span class="a_vote_num" id="a_vote_num_
从右向左,解析并编译。哈。理解这个就ok了。另外给楼主个提示,我学习和开发c语言的程序,也快20年了。类似你这样的问题,从来不纠结。。对于++i,i++,我一向保持,仅发生在通用实现方式,或独立一条语句中。哈,所谓通用实现方式,例如:
for(i = 0; i & 10 ;i++)
*p1++= *p2++;
其他情况几乎都是独立一个语句折腾,省得自己或别人对代码还要反复核对。。。累不累?反正我是累了。
<span class="a_vote_num" id="a_vote_num_
根据你的描述是,函数f()的解析是从右到左的,而i++的i是用了再加,所以i++传入的值是1,自加后i的值就是2了。
<span class="a_vote_num" id="a_vote_num_
引用来自“中山野鬼”的评论 从右向左,解析并编译。哈。理解这个就ok了。另外给楼主个提示,我学习和开发c语言的程序,也快20年了。类似你这样的问题,从来不纠结。。对于++i,i++,我一向保持,仅发生在通用实现方式,或独立一条语句中。哈,所谓通用实现方式,例如:
for(i = 0; i & 10 ;i++)
*p1++= *p2++;
其他情况几乎都是独立一个语句折腾,省得自己或别人对代码还要反复核对。。。累不累?反正我是累了。 我也不是纠结这个问题,我就想搞明白这是为什么,至于代码我也不会写成那样,于人于己都不好。。。。
<span class="a_vote_num" id="a_vote_num_
这个就是sequence point和side effect问题. func(f1(),g1());&
上面的表达式到底先执行那个函数 顺序是不确定的. 是Unspecified. &
函数调用会产生一个side effect, 而调用函数之前是一个Sequence Point. 所以可以确定func()将会在f1(), g1()之后执行. 同时两个Sequence Point之间的side effect执行顺序是unspecified的. 所以先执行f1()还是先执行g1() 是不确定的.&
这个用clang去编译得到的编译器警告就说的很清楚了,&
int func(int a,int b)
int main(void)
i = ++i + 1;
func(i,i++);
&&& clang t.c
t.c:8:9: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
i = ++i + 1;
t.c:9:13: warning: unsequenced modification and access to 'i' [-Wunsequenced]
func(i,i++);
2 warnings generated.
--- 共有 1 条评论 ---
关于顺序点, side effect的定义和说明在ISO/IEC 的5.1.2.3节和Annex C
(2年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
引用来自“中山野鬼”的评论 从右向左,解析并编译。哈。理解这个就ok了。另外给楼主个提示,我学习和开发c语言的程序,也快20年了。类似你这样的问题,从来不纠结。。对于++i,i++,我一向保持,仅发生在通用实现方式,或独立一条语句中。哈,所谓通用实现方式,例如:
for(i = 0; i & 10 ;i++)
*p1++= *p2++;
其他情况几乎都是独立一个语句折腾,省得自己或别人对代码还要反复核对。。。累不累?反正我是累了。 引用来自“mcu小生”的评论我也不是纠结这个问题,我就想搞明白这是为什么,至于代码我也不会写成那样,于人于己都不好。。。。有些事情,只有你真的做更深层的东西时,才能真正理解。否则就是今天会了。明年也忘了。对自己工作也没有帮助。哈。
更多开发者职位上
有什么技术问题吗?
mcu小生的其它问题
类似的话题请教一个C语言的题,求解答!
[问题点数:40分,结帖人whw1874]
请教一个C语言的题,求解答!
[问题点数:40分,结帖人whw1874]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。请教MAC中用terminal调试c语言程序的方法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
已注册用户请 &
Sponsored by
国内领先的实时后端云野狗 API 可用于开发即时聊天、网络游戏、实时定位等实时场景传输快!响应快!入门快!
Promoted by
请教MAC中用terminal调试c语言程序的方法
23:29:05 +08:00 · 5745 次点击
百度谷歌了一大圈,找到了一个基本思路:用记事本之类的程序写代码,比如hello world。然后在terminal里通过gcc来调试。
但遇到了很多困惑,希望大家指点:
我找到了一个smultron的程序,写了c语言代码,存放到了桌面上,叫hello.c
问题1:在terminal中如何找到hello.c?
问题2:如何能像在vc++6.0那样编译并在runtime里看到执行结果?
先行谢过!
11 回复 &| &直到
08:00:00 +08:00
& & 23:37:09 +08:00 via iPad
Google gdb
& & 23:53:32 +08:00
cd ~/Desktop/
gcc hello.c -o hello
调试的话就gdb hello
break设置断点 run运行程序 print显示变量值
再具体的楼主还是google吧
& & 23:54:54 +08:00
man gcc
man gdb
楼主可以在Linux社区里面找到更详尽的关于gcc和gdb的资料。。。
& & 23:57:15 +08:00
一并感谢各位~我再研究研究
& & 23:59:03 +08:00
1:
cd ~/Desktop
2:
gcc hello.c
./a.out
不过你还是找本Linux教材系统的学习一下吧.
& & 00:25:22 +08:00
cd ~/Desktop
make hello
& & 00:25:52 +08:00
& & 13:25:56 +08:00
@ 执行gcc hello.c的时候,提示:“-bash:gcc:command not found”?
是我的机器上没安装gcc么?我是10.7.3,在APP STORE安装了最新版XCODE。
& & 13:27:36 +08:00
@ 执行make hello的时候,提示-bash:make:conmmand not found。请问怎么回事儿?和上一楼的问题类似。
& & 13:54:28 +08:00
装 Xcode 的 Commandline Tools,编译链就有了
如果你纠结于终端,这个大概就是你想要的……
1. 学写 Makefile
2. 学 emacs/vim
3. 学 gdb
4. 学 emacs/vim 里使用 gdb 的方法
& & 15:44:19 +08:00
@ 哈哈,安装了Command line Tools果然gcc和make都有了!
& · & 272 人在线 & 最高记录 1893 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.7.3 · 47ms · UTC 22:22 · PVG 06:22 · LAX 15:22 · JFK 18:22? Do have faith in what you're doing.}

我要回帖

更多关于 c语言完数问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信