我刚刚开始在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
答案 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项指向数组末尾是可以的,但不要取消引用该地址。)