0

我正在尝试通过空格手动解析字符串,而不使用 strtok() 或 string.h 中的任何内容。这看起来像正确的方法吗?当我尝试这个时,我一直跳过字符串的末尾。

  char cmd[1024];
  int ret = read(STDIN, cmd, 1023);
  cmd[ret-1] = '\0';

     char * args[128];
     int length = 0;
     char * startptr = cmd;
     char * endptr = cmd;

     while(1){
        if(*startptr == '\n' || *startptr == '\0'){
           break;
        }
        if(*startptr == ' '){
           startptr ++;
           endptr ++;
           continue;
        }
        // startptr is placed
        if(*endptr != '\0' || *endptr != '\n' || *endptr != ' '){
           endptr ++;
           continue;
        }
        // both pointers placed
        char * i = startptr;
        for(i = startptr; i != endptr; i++){
           args[length][i-startptr] = *i;
        }
        length ++;
        startptr = endptr;
        if(*endptr == '\0' || *endptr == '\n'){
           break;
        }

     }
4

3 回答 3

2

不是不对的。逻辑表达式必须是'and'而不是'or'。
检查限制会很好,有时可能会产生有趣的效果,例如“将 ARG_MAX_LEN 更改为 2”,您会得到每个单词的第一个字符。可能这段代码会起作用。

 char cmd[1024];
 int ret = readf(cmd, 1, 1023, stdin);

 char args[128][ARG_MAX_LEN]; //two dimensional array 
 int length = 0;
 char * startptr = cmd;
 char * endptr = cmd;
 char *ap, *aep;
 if(ret > 0)
   cmd[ret-1] = '\0';
 else
   cmd[0] = '\0';
 while(*startptr != '\n' && *startptr != '\0')
 {
    if(*startptr == ' '){
       endptr = ++startptr ;
       continue;
    }
    // startptr is placed
    if(*endptr != '\0' && *endptr != '\n' && *endptr != ' '){
       endptr ++;
       continue;
    }
    // both pointers placed
    ap = &args[length][0];
    aep = ap + ARG_MAX_LEN - 1;
    while(startptr != endptr && ap != &args[length+1])
      *ap++ = *startptr++;
    if(length >= 128)
       break;
    length ++;
    startptr = endptr;
 }

如果你想获得命令行参数,你也应该寻找字符转义。

于 2012-04-15T23:06:50.197 回答
1
if(*endptr != '\0' || *endptr != '\n' || *endptr != ' '){

你应该在这里使用 && :

if(*endptr != '\0' && *endptr != '\n' && *endptr != ' '){

您也没有分配 args[length],因此当您尝试在那里写入时可能会遇到段错误。您需要先分配空间malloc,或者使用二维数组。

您在这里也有一个错误:

cmd[ret-1] = '\0';

-1 将使其覆盖缓冲区中的最后一个字符,或者更糟糕的是,如果文件为空,它将写入cmd[-1].

于 2012-04-15T21:35:06.977 回答
0

您的方法不对,但(在我看来)都不是您接受的答案(对不起 user1333967)。

除了已经指出的逻辑错误之外,您还有嵌套循环。它们几乎总是表示经过深思熟虑的代码,应该避免(在某些情况下它们是明智的,但这不是一种)。

函数是你的朋友,尤其是对于字符串处理。如果您不想使用标准库的 strtok、strcpy、strchr 等(出于某种奇怪的原因 - 也许是家庭作业?)自己编写。它们很容易编写,将简化您的代码并使其可读。忽略任何抱怨函数调用开销的人;99% 的时间它们都不重要。

于 2012-04-16T03:26:26.360 回答