免费注册 查看新帖 |

Chinaunix

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

谁帮忙改下程序错误谢谢了~考虑很多天了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-28 19:47 |只看该作者 |倒序浏览
#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;
}

论坛徽章:
0
2 [报告]
发表于 2006-08-28 19:51 |只看该作者
这个程序的意思是把int main(int argc, char *argv[])
中的*argv[]参数分开,然后输出,但是makeargv函数中的用strtok分开,
但是这个函数在的argv[1]的首地址中有“\0”的情况下就不分开了,谁能帮忙解决1下

论坛徽章:
0
3 [报告]
发表于 2006-08-28 20:16 |只看该作者
不知楼主怎样输入串的

论坛徽章:
0
4 [报告]
发表于 2006-08-28 22:50 |只看该作者
"snew = s + strspn(s, delimiters);         /* snew is real start of string */"
原因在这里  只要含有\0 S后面的字符就被截断了 所以你后面的处理就跟着错了

论坛徽章:
0
5 [报告]
发表于 2006-08-29 17:35 |只看该作者
字符串连接能不能不用“+”号啊,用strcat或者memcpy多好啊

论坛徽章:
0
6 [报告]
发表于 2006-08-29 20:14 |只看该作者
原帖由 masm32 于 2006-8-28 22:50 发表
"snew = s + strspn(s, delimiters);         /* snew is real start of string */"
原因在这里  只要含有\0 S后面的字符就被截断了 所以你后面的处理就跟着错了


那应该怎么改一下呢?
那个s地址确实是输入的地址啊。
为什么用那个strtok分隔符“\0”就不行呢
还有但是在*p[]为什么他的指针能过去呢?
比如输入123 qwe asd
在main()中的*argv[]中的
argv[1]=123
argv[2]=qwe
argv[3]=asd
指向数组的指针就行呢,他的判断机制是什么?这个我也去查查~

论坛徽章:
0
7 [报告]
发表于 2006-08-29 20:17 |只看该作者
原帖由 chenyubing 于 2006-8-29 17:35 发表
字符串连接能不能不用“+”号啊,用strcat或者memcpy多好啊


strspn函数是算字符串第一次出现的位置的,不是。net中的那个加号。

论坛徽章:
0
8 [报告]
发表于 2006-08-29 21:03 |只看该作者
UNIX Systems Programming
- Communication Concurrency and Threads, 2nd Ed (2003)

2.6 Argument Arrays中的例子。

程序本身没什么错误。
只是你想用编程中的hacker手段来测试罢了。
看来你对char *类型理解得还不是很透彻。

举例1:
$makeargv "Hello, world"
argv[0] = makeargv
argv[1] = "Hello, world"
const char *s = "Hello, world"
结果:
[0]:Hello,
[1]:world

举例2:
$makeargv "Hello, world"
argv[0] = makeargv
argv[1] = "Hello, world"
如果你在程序中改变argv[1](argv[1]的首地址中有“\0”,即,argv[1]被截短。)。
若把argv[1] = "Hello\0, world",实际上argv[1] = "Hello"。
const char *s = "Hello"
结果:
[0]:Hello


因此,你提出来的问题也就不成为问题了。

论坛徽章:
0
9 [报告]
发表于 2006-08-29 21:35 |只看该作者
帖报错,最好能帖出代码对应的行数

论坛徽章:
0
10 [报告]
发表于 2006-08-30 19:52 |只看该作者
原帖由 cmh_2003 于 2006-8-29 21:35 发表
帖报错,最好能帖出代码对应的行数


没有错误啊,可能是网页的问题,你在调试1下吧。在gcc
下要有错误就报哪行有问题了。

[ 本帖最后由 wenhuaixiang 于 2006-8-30 20:23 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP