免费注册 查看新帖 |

Chinaunix

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

谁帮忙改下程序,已经想了很多天了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-28 19:59 |只看该作者 |倒序浏览
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int makeargv(const char *s, const char *delimiters, char ***argvp);

int main(int argc, char *argv[]) {
   char delim[] = " \t";
   int i;
   char **myargv;
   int numtokens;

   if (argc != 2) {
      fprintf(stderr, "Usage: %s string\n", argv[0]);
      return 1;
   }   
   if ((numtokens = makeargv(argv[1], delim, &myargv)) == -1) {
      fprintf(stderr, "Failed to construct an argument array for %s\n", argv[1]);
      return 1;
   }
   printf("The argument array contains:\n");
   for (i = 0; i < numtokens; i++)
      printf("%d:%s\n", i, myargv[i]);
   return 0;
}
int makeargv(const char *s, const char *delimiters, char ***argvp) {
   int error;
   int i;
   int numtokens;
   const char *snew;
   char *t;

   if ((s == NULL) || (delimiters == NULL) || (argvp == NULL)) {
      errno = EINVAL;
      return -1;
   }
   *argvp = NULL;                           
   snew = s + strspn(s, delimiters);         /* snew is real start of string */
   if ((t = malloc(strlen(snew) + 1)) == NULL)
      return -1;
   strcpy(t, snew);               
   numtokens = 0;
   if (strtok(t, delimiters) != NULL)     /* count the number of tokens in s */
      for (numtokens = 1; strtok(NULL, delimiters) != NULL; numtokens++) ;

                             /* create argument array for ptrs to the tokens */
   if ((*argvp = malloc((numtokens + 1)*sizeof(char *))) == NULL) {
      error = errno;
      free(t);
      errno = error;
      return -1;
   }
                        /* insert pointers to tokens into the argument array */
   if (numtokens == 0)
      free(t);
   else {
      strcpy(t, snew);
      **argvp = strtok(t, delimiters);
      for (i = 1; i < numtokens; i++)
          *((*argvp) + i) = strtok(NULL, delimiters);
    }
    *((*argvp) + numtokens) = NULL;             /* put in final NULL pointer */
    return numtokens;
}

这个程序的意思是把int main(int argc, char *argv[])
中的*argv[]参数分开,然后输出,但是makeargv函数中的用strtok分开,
但是这个函数在的argv[1]的首地址中有“\0”的情况下就不分开了,谁能帮忙解决1下

论坛徽章:
0
2 [报告]
发表于 2006-08-29 23:15 |只看该作者
原帖由 wenhuaixiang 于 2006-8-28 19:59 发表
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int makeargv(const char *s, const char *delimiters, char ***argvp);

int main(int argc, ...

>>
>>
>>"函数在的argv[1]的首地址中有“\0”的情况"是什么意思?
>>我这里运行很好阿
>>
>>

论坛徽章:
0
3 [报告]
发表于 2006-08-30 02:13 |只看该作者

回复 1楼 wenhuaixiang 的帖子

用getopt()和getopt_long()不是更好么?

论坛徽章:
0
4 [报告]
发表于 2006-08-30 11:45 |只看该作者
原帖由 OLDHAND.ORG 于 2006-8-30 02:13 发表
用getopt()和getopt_long()不是更好么?

>>
>>
>>可能是他想自己写一个
>>
>>

论坛徽章:
0
5 [报告]
发表于 2006-08-30 15:26 |只看该作者
不知道楼主要做什么,原来char *argv[]本来就分开了各个参数,直接输出就可以了

况且用strtok来分割字符串, 本来就是字符串结束就不再切割了,"\0" 等同于'\0',为字符串结束符
如果你要实现,就需要用'\'进行强制转换吧!
比如argv[1]="\\0\ta\tb",这样就可以了

论坛徽章:
0
6 [报告]
发表于 2006-08-31 18:17 |只看该作者
原帖由 Bayweb 于 2006-8-29 23:15 发表

>>
>>
>>"函数在的argv[1]的首地址中有“\0”的情况"是什么意思?
>>我这里运行很好阿
>>
>>


你说的运行很好是什么意思?
是你在编译完后运行程序,后面紧跟着参数比如123 qwe asd
然后程序就输出这几个参数吗?

论坛徽章:
0
7 [报告]
发表于 2006-08-31 18:29 |只看该作者
原帖由 OLDHAND.ORG 于 2006-8-30 02:13 发表
用getopt()和getopt_long()不是更好么?


这个例子是我看得unix 高级编程上面的例子,他的意思就是分开命令行中的参数,但是
我运行他的例子不行始终不全部输出参数,所以我来问下~
希望高手能修改那个函数1下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP