谁帮忙改下程序,已经想了很多天了

发布于 2022-07-19 12:41:05 字数 3650 浏览 11 评论 6

#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 stringn", argv[0]);
      return 1;
   }   
   if ((numtokens = makeargv(argv[1], delim, &myargv)) == -1) {
      fprintf(stderr, "Failed to construct an argument array for %sn", argv[1]);
      return 1;
   }
   printf("The argument array contains:n");
   for (i = 0; i < numtokens; i++)
      printf("%d:%sn", 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]的首地址中有“”的情况下就不分开了,谁能帮忙解决1下

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

你的背包 2022-07-26 22:53:56

原帖由 OLDHAND.ORG 于 2006-8-30 02:13 发表
用getopt()和getopt_long()不是更好么?

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

A君 2022-07-26 22:34:31

原帖由 Bayweb 于 2006-8-29 23:15 发表

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

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

沧笙踏歌 2022-07-26 22:24:46

不知道楼主要做什么,原来char *argv[]本来就分开了各个参数,直接输出就可以了

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

涙—继续流 2022-07-26 21:46:26

原帖由 OLDHAND.ORG 于 2006-8-30 02:13 发表
用getopt()和getopt_long()不是更好么?

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

明天过后 2022-07-26 14:27:16

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

寒江雪… 2022-07-26 13:14:24

原帖由 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]的首地址中有“”的情况"是什么意思?
>>我这里运行很好阿
>>
>>

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文