免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: sunshine1750
打印 上一主题 下一主题

[函数] 想弄一个函数去掉字符串左边空格, 出问题啦 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-04-19 23:25 |只看该作者
改好了, 虽然ltrim(char *ss)传入地址, 但本质上还是传值,
因为形参和实参占用不同的内存地址, 但它们指向同一地址

方法一:返回字符指针:
char *ltrim(char *ss) {
  char *p;
  while( *ss == ' ') {
   ss = ss+1;
   printf("%p\n", ss);
  }
  p = ss;
  return p;
}

main()
{
  char *s;
  s = "  abc";  /* 比如s指向FFD0 */
  s = ltrim(s); /* 现在s指向FFD2 */
  printf("---%s---\n",s);
  getchar();
  return 0;
}

方法二:
void ltrim(char *ss);
int main()
{
  char *s;   s = (char *)malloc(10);
  strcpy(s, "  abc";   /* 比如s指向FFD0 */
  ltrim(s); /* 现在s仍指向FFD0, 但FFD0开始的字符串由"  abc"\0变成了"abc"\0\0 */
  printf("---%s---\n",s);
  getchar();
  free(s);
  return 0;
}

void ltrim(char *ss)
{
  int j=0;
  int len=strlen(ss);
  while(ss[0] == ' '){
       for(j=0;j<len;j++)
           ss[j]=ss[j+1];
  }
}

方法一调用较麻烦,运行效率高;
方法二调用方便, 运行效率差;
有没可能综合方法一,二的优点,用指向指针的指针来实现?

[ 本帖最后由 sunshine1750 于 2007-4-20 15:51 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2007-04-20 00:17 |只看该作者
原帖由 jist12321 于 2007-4-19 18:51 发表
你这里定义的是char *s,这时的s是一个变量,是一个指向指针的变量,你要改变他的地址,那么你就得把指针这个变量的地值传进去,也就是说参数里应该是int ltrim(char **ss), 这时,你再试试看.


不知道怎么做, 能给个DEMO吗?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
13 [报告]
发表于 2007-04-20 00:20 |只看该作者
这个问题是刚刚开始学 C 的朋友经常性犯的错误。

论坛徽章:
0
14 [报告]
发表于 2007-04-20 08:43 |只看该作者
顶一把

论坛徽章:
0
15 [报告]
发表于 2007-04-20 09:02 |只看该作者
其实指针变量和普通变量是一样的,在向函数传参数的时候也是一样的,统一对待~
在函数中改变指针的值和在函数中改变指针指向地址单元的值是不一样的
改变指针的值是不会反映给调用者的~

论坛徽章:
0
16 [报告]
发表于 2007-04-20 09:28 |只看该作者
方法二:
void ltrim(char *ss);
int main()
{
  char *s="  abc"; /* 比如s指向FFD0 */
  ltrim(s); /* 现在s仍指向FFD0, 但FFD0开始的字符串由"  abc"\0变成了"abc"\0\0 */
  printf("---%s---\n",s);
  getchar();
  return 0;
}

void ltrim(char *ss)
{
  int j=0;
  int len=strlen(ss);
  while(ss[0] == ' '){
       for(j=0;j<len;j++)
           ss[j]=ss[j+1];
  }
}


这里的方法二是错误的,不知道你在机器上跑过没有。
char *s="  abc"
你这里定义了一个指向常量字符串"  abc"的字符串指针,而这里的"  abc"是放在只读存储区里的,是不能写,和修改的, 象这样 s[0]='d' 给这段内存区重新赋值是错误的。会出现 "段错误"

而前面rainballdh兄写的是 char s[]="  abc"和你写的是不一样的,这里定义的是一个字符串数组,内核是要为该数组分配内存空间的(而上面定义的只是一个指针)。

[ 本帖最后由 zghover 于 2007-4-20 09:31 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
17 [报告]
发表于 2007-04-20 09:43 |只看该作者
原帖由 zghover 于 2007-4-20 09:28 发表
void ltrim(char *ss)
{
  int j=0;
  int len=strlen(ss);
  while(ss[0] == ' '){
       for(j=0;j<len;j++)
           ss[j]=ss[j+1];
  }
}


这个如下改,就可以了.

  1. char *ltrim(char *ss)
  2. {
  3.   int j=0,i=0;
  4.   int flag = FALSE;
  5.   int len=strlen(ss);
  6.   for(j=0;j<len;j++)
  7.   {
  8.        if( ss[j] == ' ' && flag == FALSE)
  9.            i++ ;
  10.        else {
  11.            ss[j]=ss[j+i];
  12.            if ( ss[j] != ' ')
  13.                 flag = TRUE ;
  14.        }
  15.     }
  16.     ss[j-i] = '\0';
  17.     return(ss);
  18. }

复制代码


写得好混乱,大概可以满足要求吧.  ^_^.

论坛徽章:
0
18 [报告]
发表于 2007-04-20 09:57 |只看该作者
显然要移动内存吧,只是改一下字符串头的位置另外弄个字符串出来早晚会弄些野指针出来
还有如果是 trim(char ** str),传出来的字符串你还敢free么

论坛徽章:
0
19 [报告]
发表于 2007-04-20 15:44 |只看该作者
原帖由 cugb_cat 于 2007-4-20 09:02 发表
其实指针变量和普通变量是一样的,在向函数传参数的时候也是一样的,统一对待~
在函数中改变指针的值和在函数中改变指针指向地址单元的值是不一样的
改变指针的值是不会反映给调用者的~

顶这个~~~

原帖由 zghover 于 2007-4-20 09:28 发表
方法二:
void ltrim(char *ss);
int main()
{
  char *s="  abc"; /* 比如s指向FFD0 */
  ltrim(s); /* 现在s仍指向FFD0, 但FFD0开始的字符串由"  abc"\0变成了"abc"\0\0 */
...

说得对, 我修改了那一贴
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP