菜鸟求教c语言

szh7379 2012-09-08 09:45:16
void SD (char *p1)
{
char *p2;
while (*p1 != '\0' )
{
if (*p1 == ' ')
{
p2 = p1;
while(*p2 != '\0')
{
*p2 = *(p2+1);
p2++;
}
p1--; //抵消下面的p1++
}
p1++;
}
}
这是一个自定义函数,去除字符串中的空格,但是我看不懂p2存在的意义,还有p1为什么要进行 -- 再 ++,那当*p1为空格时候,*p1也没有赋值为*(p1+1),只是p2中的那个地址的空格被丢弃,然后p1--退回一个地址,再++前进一个地址,*p1岂不是一直为空格?
...全文
197 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
szh7379 2012-09-10
  • 打赏
  • 举报
回复
soga,我以为p2算是新建的,有自己的存储空间呢,指针+数组太混乱了*_*晕死了[Quote=引用 6 楼 的回复:]

1、p2是指向p1所指向地址的指针,所以直接通过p2修改对应地址上的值,不需要再赋给p1。

2、p1--和p1++不会一直p1一直停留在空格,因为p2已通过地址指针修改过了p1指向的值。(不过好像p1--没什么意义嘛,有没有都可以)


引用 5 楼 的回复:
这些都理解,p2算是把首空格清除了,但是此后的p2没有赋给p1,p1有改变吗?还有p2是在一个循环中把第一个空格去掉了,……
[/Quote]
szh7379 2012-09-10
  • 打赏
  • 举报
回复
我是一个很喜欢捣鼓计算机的人,一般遇到问题都会到网上查,查不到才会发帖。
由于我不是计算机专业的,捣鼓计算机只能是些常见病症,但后来我发现我希望用计算机做的事不只是抄抄别人的方法而已,我希望自己成为大牛。但是编程真的很枯燥,而且自学很难懂,遇到问题没法找人问,只能自己在那儿想,就是这个原因,我看了好多编程视频,但是看到一点就不想看下去了。但浑浑噩噩过了两三年,我还是决定痛苦的学编程,这样才能变强。
计算机是我的兴趣所在,但是我却一点专业知识都没有,而且遇到难题也没法请教别人,这得多痛苦啊,汇编……我查过挺多,都说是C语言是基础,所以我就把C语言当作入门了,压根儿就不知道用汇编来理解C语言。
我没有老师,没有考题,书倒是有,我也相信网络可以带了知识。[Quote=引用 10 楼 的回复:]

VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C……
[/Quote]
赵4老师 2012-09-10
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑!
这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!!

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?
misshare 2012-09-09
  • 打赏
  • 举报
回复
用笔画一下就出来了额
xuuyaoo 2012-09-09
  • 打赏
  • 举报
回复
楼主可以自己测试一下,在每个循环输出p1、p2指向地址上的值。就能看出来指针操作的步骤和结果了。
xuuyaoo 2012-09-09
  • 打赏
  • 举报
回复
1、p2是指向p1所指向地址的指针,所以直接通过p2修改对应地址上的值,不需要再赋给p1。

2、p1--和p1++不会一直p1一直停留在空格,因为p2已通过地址指针修改过了p1指向的值。(不过好像p1--没什么意义嘛,有没有都可以)


[Quote=引用 5 楼 的回复:]
这些都理解,p2算是把首空格清除了,但是此后的p2没有赋给p1,p1有改变吗?还有p2是在一个循环中把第一个空格去掉了,但只是在p2中去掉了,p1中没有变化吧,然后这个循环下边的p1--和p1++不是让p1的地址一直停留在空格(因为p1中的空格没被去掉)那儿吗,字符串后边的其他空格怎么去掉的,p2又是怎么赋给p1的?

引用 1 楼 的回复:

是这样的:

void SD (char……
[/Quote]
szh7379 2012-09-08
  • 打赏
  • 举报
回复
这些都理解,p2算是把首空格清除了,但是此后的p2没有赋给p1,p1有改变吗?还有p2是在一个循环中把第一个空格去掉了,但只是在p2中去掉了,p1中没有变化吧,然后这个循环下边的p1--和p1++不是让p1的地址一直停留在空格(因为p1中的空格没被去掉)那儿吗,字符串后边的其他空格怎么去掉的,p2又是怎么赋给p1的?[Quote=引用 1 楼 的回复:]

是这样的:

void SD (char *p1)
{
char *p2;
while (*p1 != '\0' ) //这个判断是不是到了尾部, 不是尾部进入循环
{
if (*p1 == ' ') //如果遇到了,空格
{
p2 = p1; //这一步,将字符串中“空格字符”的地址,给了p2, 也是将以空格字符起始到字符串尾部的子串,给了p2, 这时p2……
[/Quote]
szh7379 2012-09-08
  • 打赏
  • 举报
回复
这个函数对中间有多个空格的字符串不行吧[Quote=引用 3 楼 的回复:]

给你个我写过的吧!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

short int TrimString(char *str);

int main()
{
char szArray[] = " Hello, World! ";
int i = TrimString(szArr……
[/Quote]
shilijun11 2012-09-08
  • 打赏
  • 举报
回复
给你个我写过的吧!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

short int TrimString(char *str);

int main()
{
char szArray[] = " Hello, World! ";
int i = TrimString(szArray);
printf("szArray = %s\n", szArray);
return 0;
}

short int TrimString(char *str)
{
int i = 0;
for (i = strlen(str)-1; i >= 0; i--) //以字符串的长度减一开始,去除尾部的空格。
if (str[i] != ' ' && str[i] != '\t' && str[i] != '\n')
break; //从字符串尾部开始直到遇到不是' ',\t ,\n时退出,也就是遇到有字符时退出。
str[i + 1] = '\0'; //此时将其尾部设置为‘\0’;
for (i = 0; i < strlen(str); i++) //然后开始从字符串首部搜索
if (str[i] != ' ')
break; //遇到字符时退出、
strcpy(str, str + i); //将其字符串前移。例如:第一个字符是空格,则将从第二个字符及其后的字符串向前移动一位。
return (strlen(str));
}
shilijun11 2012-09-08
  • 打赏
  • 举报
回复
给你个我写过的吧!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

short int TrimString(char *str);

int main()
{
char szArray[] = " Hello, World! ";
int i = TrimString(szArray);
printf("szArray = %s\n", szArray);
return 0;
}

short int TrimString(char *str)
{
int i = 0;
for (i = strlen(str)-1; i >= 0; i--)
if (str[i] != ' ' && str[i] != '\t' && str[i] != '\n')
break;
str[i + 1] = '\0';
for (i = 0; i < strlen(str); i++)
if (str[i] != ' ')
break;
strcpy(str, str + i);
return (strlen(str));
}
guoqiang21247 2012-09-08
  • 打赏
  • 举报
回复
是这样的:

void SD (char *p1)
{
char *p2;
while (*p1 != '\0' ) //这个判断是不是到了尾部, 不是尾部进入循环
{
if (*p1 == ' ') //如果遇到了,空格
{
p2 = p1; //这一步,将字符串中“空格字符”的地址,给了p2, 也是将以空格字符起始到字符串尾部的子串,给了p2, 这时p2也可以看做一个字符串了。

while(*p2 != '\0') // 这个循环是为了清除, p2字符串中最前面的那个空格的。 空格字符后面的每个字符,都提前了一次。
{
*p2 = *(p2+1);
p2++;
}

p1--; //抵消下面的p1++ 其实这里可以用一个continue语句,直接跳过的
}

p1++;

}

}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧