如何在C中清除此数组指针?

时间:2009-05-17 00:26:59

标签: c arrays pointers

我正在尝试使用系统调用进行基本的bash,但是我对指针数组有一些小问题。

要恢复我的代码,我从stdin读取带有read()的命令到缓冲区然后我使用strsep()将命令从参数和所有参数分离到一个数组中。然后我使用fork()创建一个新进程,并使用execvp()的相关参数执行该命令。

所有这一切都进入无限循环,直到用户键入“退出”(尚未编码)。问题是在第一次迭代之后,我需要* pArgs为空,用于下一个命令和参数。我不知道怎么做......

这是我的代码:

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

int main(int argc, char **argv) {
    char bBuffer[BUFSIZ], *pArgs[10], *aPtr = NULL, *sPtr;
    int aCount;
    pid_t pid;

    while(1) {
        write(1, "\e[1;31mmyBash \e[1;32m# \e[0m", 27);
        read(0, bBuffer, BUFSIZ);

        sPtr = bBuffer;
        aCount = 0;

        do {
            aPtr = strsep(&sPtr, " ");
            pArgs[aCount++] = aPtr;
        } while(aPtr);

        pArgs[aCount-2][strlen(pArgs[aCount-2])-1] = '\0';

        // Debug code to output pArgs content
        write(1, "|>", 2);
        write(1, pArgs[0], strlen(pArgs[0]));
        write(1, "<|", 2);

        if(strlen(pArgs[0]) > 1) {
            pid = fork();

            if(pid == -1) {
                perror("fork");
                exit(1);
            }

            if(pid == 0) {
                execvp(pArgs[0], pArgs);
                exit(0);
            }
        }
    }

    return 0;
}

P.S:很抱歉,我暂时无法提供输入和输出测试用例。希望,这并不难理解和修复你们不需要它。如果需要,我会稍后发布...

只是为了清理:
我知道我问过如何清除阵列,我得到了答案。但现在我觉得很明显,我的问题不在于此,而是由litb指出缓冲区正在收集的垃圾。使用空字符终止字符串比清除数组更有意义。这就是为什么我将litb的答案标记为正确的答案。

2 个答案:

答案 0 :(得分:7)

int i;
for (i = 0; i < 10; i++)
   pArgs[i] = NULL;

答案 1 :(得分:2)

您的问题是在读取数据后不添加空字符。所以strsep来电不知道应该停在哪里。在C中,字符串必须以空字符(称为终止空字符)终止。

// don't forget to add error handling at some point (s == -1)
ssize_t s = read(0, bBuffer, BUFSIZ-1);
bBuffer[s] = '\0';

有了这个,我不知道现在应该清除什么数组,因为execvp将读取参数,直到第一个空指针。但是,do循环已经添加了空指针,这是最后一次调用strsep返回的空指针。

问题当然也可以通过清除bBuffer(扫描第一个命令后*pArgs所指向的数据)来解决。请注意,您必须在第一次扫描之前执行此操作,因为您无法假设bBuffer数组中的字符被初始化为任何合理的值。

memset(bBuffer, 0, sizeof bBuffer);

放在read调用之前(但在任何情况下,只读最大BUFSIZE-1,因为终止空字符也必须有空格!)。

但正如我上面所示,你不需要这个memset调用。只需手动添加终止空字符。