在标记化之后如何使字符串包含定界符?

时间:2019-04-18 08:51:03

标签: c

我刚刚开始在Ubuntu上学习C语言,我一直在尝试制作一个简单的Shell,它的作用有点像Shell。因此,在我获得命令行之后,我想我可能不得不用定界符来分割行。首先,我想使用“ strtok_r()”将包含定界符的'&'delim标记为字符串,但是“ strcat()”在某种程度上无法满足我的需求

我尝试在制作令牌后使用“ strcat()”。如果我使用该功能,则第一个标记的输出与第二个标记的输出会很好地工作,但是,该标记将被丢弃。

输出就像这样。可以说我有这些令牌。

token1 : abcde
token2 : fghij

然后如果我使用“ strcat('&')”,它的输出就像

token1 : abcde&
token2 : &

我认为这可能是因为我试图在“ token1”末尾添加的定界符会影响“ token2”的需求。

#include <stdio.h>
#include <string.h>

int main()
{
        static const char delim[] = "&";

        char str[256] = "sleep 5 & echo Hello & sleep 5; echo Hello";

        char *args[50];

        char *save;
        char *pBuf;
        int i = 0;

        for(pBuf = strtok_r(str, delim, &save);
                        pBuf;
                        pBuf = strtok_r(NULL, delim, &save)){

                printf("%d\n", i);
                args[i++] = pBuf;

        }


        /** OUT PUT START*/

        i = 0;

        while(args[i]){
                printf("args[%d] : %s\n", i , args[i]);
                i++;
        }

        /**OUT PUT END  */

        return 0;
}


********OUT PUT

args[0] : sleep 5
args[1] :  echo Hello
args[2] :  sleep 5; echo Hello

********EXPECTED OUT PUT

args[0] : sleep 5 &
args[1] : echo Hello &
args[2] : sleep 5; echo Hello 

1 个答案:

答案 0 :(得分:1)

问题是strtok在这种情况下有什么用。除了使事情变得复杂之外,您还可以使用strchr手动进行解析。找到定界符&后,很快就可以看到尾随空格并打印该空格和结尾,而不是开头。示例:

#include <string.h>
#include <stdio.h>

int main(void)
{
  const char str[256] = "sleep 5 & echo Hello & sleep 5; echo Hello";
  size_t length = strlen(str);

  const char* s1 = str;
  const char* s2;
  const char delim = '&';

  while(s1 < str+length)
  {
    s2 = strchr(s1, delim);
    if(s2 == NULL)
    {
      s2 = &str[length]; // point at null term
    }
    else
    {
      s2++; // point at space
    }
    printf("%.*s\n", s2-s1, s1); // print (s2-s1) characters
    s1 = s2+1; // point at next char after space, or 1 past null term
  }
}

输出:

sleep 5 &
echo Hello &
sleep 5; echo Hello

(请注意,在C语言中,将1项指向数组末尾是可以的,但不要取消引用该地址。)