解析 C 中的命令行条目:实现 shell
Parsing command-line entries in C: implementing a shell
我正在用 C 实现一个 shell,并且我 运行 遇到一些解析命令行条目的问题。我希望我的解析器方法将由空白字符分隔的命令行条目分开,并将结果 return 作为双字符指针。即,假设我有 "ls -l >ls.txt",我的解析器应该 return 一个 char **r with r[0]="ls", r[1]="-l", and r[2 ]=">ls.txt".
这是我当前的解析方法的代码,顺便说一句,这是段错误,我不知道如何解决这个问题:
char **parser(int *argc, char *s)
{
char **r;
char *t, *m;
int i,n,size;
t = malloc(strlen(s)); // firs i used this instead of *r, but i run
// into trouble when i have more than two
// argc. ( You see why, right?)
//strcpy(t,s);
i = 0;
size = 5;
r = malloc(size*sizeof(char *));
while (( m = strchr(s, ' '))) {
n = ((int)m) - ((int)s);
if (i==0) {
*r = malloc(n);
} else {
*r = realloc(*r, n);
}
strncpy(*r, s, n);
*r[n]= '[=11=]';
s = (char*)(s+n+1);
if (i == size)
r = realloc(r, (size = 2*size)*sizeof(char*));
i++;
r = (char **)(r + sizeof(char*));
}
s[strlen(s)-1] = '[=11=]';
if ((i<1) || (strlen(s)>1)) {
*r = s;
}
*argcp = ++i;
return r;
}
我知道我的代码并不理想。使用 strsep 可以做得更好,但我主要关心的是如何为我想要 return 的双字符指针管理内存。
感谢您的帮助!
这是一个快速的刺。
我的C生锈了,所有的铰链都卡住了,所以。
前提是你最终会得到一个指向指针数组的指针。不过,关键细节位于该指针列表的末尾,是参数数据本身。所以当你完成后,你只需要释放返回的指针。
未经测试。这里很可能会出现一次性错误。
编辑,我编译了,很快就测试了。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char **parser(int *argc, char *s) {
char **r, **rp;
char *t, *p, *w;
void *vp;
int l;
l = strlen(s); // size of cmd line
vp = malloc(l + (*argc * sizeof(char *))); // total buffer size
t = (char *)(vp + (*argc * sizeof(char *))); // offset into buffer for argument copy
r = (char **)vp; // start of buffer, start of pointer array to arguments
strcpy(t, s); // copy arguments in to buffer
p = t; // parsing pointer
w = t; // word pointer for each argument
rp = r; // storage for first pointer
while(*p) { // while not at end of string
if (*p == ' ') { // if we find a space
if (w) { // if we have a word pointer assigned
*rp++ = w; // store the word pointer
w = NULL; // set word pointer to null
*p = '[=10=]'; // terminate argument with a 0
} // else do nothing continue to skip spaces
} else {
if (w == NULL) { // If we haven't got a new arg yet
w = p; // set it
} // otherwise, just keep scanning
}
p++; // move along the string
}
if (w) { // clean up at the end if we have an arg
*rp++ = w;
w = NULL; // no reason to set 0 at the end, it's already there from strcpy
}
return r;
}
int main() {
char *cmd = "arg1 arg2";
int argc = 2;
char **r = parser(&argc, cmd);
printf("%s\n",r[0]);
printf("%s\n",r[1]);
}
我正在用 C 实现一个 shell,并且我 运行 遇到一些解析命令行条目的问题。我希望我的解析器方法将由空白字符分隔的命令行条目分开,并将结果 return 作为双字符指针。即,假设我有 "ls -l >ls.txt",我的解析器应该 return 一个 char **r with r[0]="ls", r[1]="-l", and r[2 ]=">ls.txt".
这是我当前的解析方法的代码,顺便说一句,这是段错误,我不知道如何解决这个问题:
char **parser(int *argc, char *s)
{
char **r;
char *t, *m;
int i,n,size;
t = malloc(strlen(s)); // firs i used this instead of *r, but i run
// into trouble when i have more than two
// argc. ( You see why, right?)
//strcpy(t,s);
i = 0;
size = 5;
r = malloc(size*sizeof(char *));
while (( m = strchr(s, ' '))) {
n = ((int)m) - ((int)s);
if (i==0) {
*r = malloc(n);
} else {
*r = realloc(*r, n);
}
strncpy(*r, s, n);
*r[n]= '[=11=]';
s = (char*)(s+n+1);
if (i == size)
r = realloc(r, (size = 2*size)*sizeof(char*));
i++;
r = (char **)(r + sizeof(char*));
}
s[strlen(s)-1] = '[=11=]';
if ((i<1) || (strlen(s)>1)) {
*r = s;
}
*argcp = ++i;
return r;
}
我知道我的代码并不理想。使用 strsep 可以做得更好,但我主要关心的是如何为我想要 return 的双字符指针管理内存。
感谢您的帮助!
这是一个快速的刺。
我的C生锈了,所有的铰链都卡住了,所以。
前提是你最终会得到一个指向指针数组的指针。不过,关键细节位于该指针列表的末尾,是参数数据本身。所以当你完成后,你只需要释放返回的指针。
未经测试。这里很可能会出现一次性错误。
编辑,我编译了,很快就测试了。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char **parser(int *argc, char *s) {
char **r, **rp;
char *t, *p, *w;
void *vp;
int l;
l = strlen(s); // size of cmd line
vp = malloc(l + (*argc * sizeof(char *))); // total buffer size
t = (char *)(vp + (*argc * sizeof(char *))); // offset into buffer for argument copy
r = (char **)vp; // start of buffer, start of pointer array to arguments
strcpy(t, s); // copy arguments in to buffer
p = t; // parsing pointer
w = t; // word pointer for each argument
rp = r; // storage for first pointer
while(*p) { // while not at end of string
if (*p == ' ') { // if we find a space
if (w) { // if we have a word pointer assigned
*rp++ = w; // store the word pointer
w = NULL; // set word pointer to null
*p = '[=10=]'; // terminate argument with a 0
} // else do nothing continue to skip spaces
} else {
if (w == NULL) { // If we haven't got a new arg yet
w = p; // set it
} // otherwise, just keep scanning
}
p++; // move along the string
}
if (w) { // clean up at the end if we have an arg
*rp++ = w;
w = NULL; // no reason to set 0 at the end, it's already there from strcpy
}
return r;
}
int main() {
char *cmd = "arg1 arg2";
int argc = 2;
char **r = parser(&argc, cmd);
printf("%s\n",r[0]);
printf("%s\n",r[1]);
}