免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7025 | 回复: 18
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-19 17:37 |只看该作者 |倒序浏览
偶是菜鸟, 路过的请指点一下

int ltrim(char *ss) {
  while( *ss == ' ') {
   ss = ss+1;
   printf("%p\n", ss);      
}
  return(0);                    /* 到这里, ss已经变成"abc"了 */
}


main()
{
  char *s;
  s = "  abc";
  ltrim(s);
  printf("---%s---",s);   /* 为什么还是"  abc"啊? */
  getchar();
  return (0);
}

[ 本帖最后由 sunshine1750 于 2007-4-19 22:17 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-04-19 17:38 |只看该作者
这样的问题交给Perl吧

论坛徽章:
0
3 [报告]
发表于 2007-04-19 17:43 |只看该作者
s = (char *)malloc( 20 );
  s = "  abc";
这样写不觉得多余吗?
ltrim(s);
这里上传值传给了函数里的一个栈变量ss;
ss = ss+1;
你改变的只栈变量ss,而不是s

论坛徽章:
0
4 [报告]
发表于 2007-04-19 17:44 |只看该作者
传指针的指针

论坛徽章:
0
5 [报告]
发表于 2007-04-19 18:03 |只看该作者
int ltrim(char *ss) {
  int i;
  while( *ss == ' ') {
   ss = ss+1;
   printf("%p\n", ss);      /* 循环能看到ss首地址加1 */
  }
  if (*ss == 0) {*ss=' '; *(ss+1)=0;}      //这句有什么作用,程序跑不到这.
  return(0);                    /* 到这里, ss已经变成"abc"了 */
}


main_()
{
  char *s;
  s = (char *)malloc( 20 );        //没用处
  s = "  abc";
  ltrim(s);
  printf("---%s---",s);   /* 为什么还是"  abc"啊? */
  getchar();          //编译工具 turbo c?
  return 0;
}


实现有2种方法1:传双指针  2:ltrim 返回 指针.
PS:虽然初学,编码格式还是需要注意的.

论坛徽章:
0
6 [报告]
发表于 2007-04-19 18:14 |只看该作者

  1. /* 去掉 s中所有的空格,\n,\t  */
  2. char*        trim(char* s)
  3. {
  4.         long        lLen;
  5.         register        i, k;

  6.         //        输入为空则直接返回
  7.         if(!s) return NULL;

  8.         lLen = (long)strlen(s);
  9.         for(i = 0, k = 0; i < lLen; i++)
  10.         {
  11.                 if(s[i] != ' ' && s[i] != 9 && s[i] != 10 && s[i] != 13)
  12.                         s[k++] = s[i];
  13.         }
  14.         s[k] = 0;
  15.         return s;
  16. }
复制代码

满足楼主需求否?

论坛徽章:
0
7 [报告]
发表于 2007-04-19 18:31 |只看该作者
  1. #include <stdio.h>
  2. #include <string.h>

  3. void ltrim(char *str);

  4. int main()
  5. {
  6.   char s[]="      abcda";

  7.   ltrim(s);

  8.   printf("----%s----\n",s);

  9.   return 0;
  10. }

  11. void ltrim(char *str)
  12. {
  13.   int i=0,j=0;

  14.   int len=strlen(str);

  15.   while(str[i] == ' '){
  16.        for(j=i;j<len;j++)
  17.            str[j]=str[j+1];
  18.   }

  19. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2007-04-19 18:42 |只看该作者
谢谢楼上各位了~~~

to: yuangong
多谢提醒, 写的是proc程序, 用turbo c方便调试
双指针是指向指针的指针吗? 我的理解ltrim(char *ss)已经是传址了;

论坛徽章:
0
9 [报告]
发表于 2007-04-19 18:46 |只看该作者
何必这么麻烦!
char *ltrim(char *ss) {
        char *p;
        p = ss + 2;
        return p;
}
搞定

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

[ 本帖最后由 jist12321 于 2007-4-19 18:59 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP