-1

これは次のコードの出力ですが、正しいパスであると期待しています。patharray [1] = ls / lsなどの奇数インデックスの出力の何が問題になっていますか?

---/usr/lib/lightdm/lightdm/ls
---ls/ls
---/usr/local/bin/ls
---ls/ls
---/usr/bin/ls
---ls/ls
---/bin/ls
---ls/ls

char *pathsarray[MAXARGS];//path
char *path=getenv("PATH");
tokenizeEnvPaths(path);

int i;

for(i=0;i<MAXARGS;i++)
{
    if(pathsarray[i] != NULL)
    {
        strcat(pathsarray[i],"/");
        strcat(pathsarray[i],"ls");
        fprintf(stderr,"---%s\n",pathsarray[i]);
    }


}
4

2 に答える 2

1

の各文字列の末尾に空きスペースがないようですpathsarray。つまり、文字列の末尾に何かを連結するために使用できるスペースがありません。境界チェックを行わないためstrcat、文字列の終わりを超えてメモリを踏みつけ、他のメモリ(同じ配列内の他の文字列を含む)を破壊しています。

文字列はどのようにpathsarray割り当てられ、割り当てられますか?あなたはその部分を見せません。彼らはmalloc編集されていますか?

文字列が作成された後で文字列に3文字を追加する場合は、文字列に最初の内容が必要とするよりも少なくとも3バイト多く割り当てる必要があります。そうでない場合は、より大きなバッファを再割り当てする必要があります。後で文字列に何かを追加したいときのために。

于 2012-12-08T18:51:04.720 に答える
0

これがSSCCE(短い、自己完結型、正しい例)です。

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

enum { MAXARGS = 32 };
enum { MAXPATHLEN = 1024 };

char *pathsarray[MAXARGS];

static void add_path(char **dir, const char *begin, const char *end)
{
    if (end == begin)
    {
        begin = ".";
        end = begin + 1;
    }
    size_t len = end - begin;
    *dir = malloc(len + 1);
    memmove(*dir, begin, len);
    (*dir)[len] = '\0';
    printf("Found: %s\n", *dir); // Debug
}

/* Split path into components - ignore empty elements */
static size_t tokenizeEnvPaths(const char *path, char **dirs, size_t max_dirs)
{
    const char *begin = path;
    const char *end;
    size_t num_dirs = 0;

    while (num_dirs < max_dirs && (end = strchr(begin, ':')) != 0)
    {
        add_path(&dirs[num_dirs++], begin, end);
        begin = end + 1;
    }
    if (num_dirs < max_dirs && *begin != '\0')
        add_path(&dirs[num_dirs++], begin, begin + strlen(begin));
    return num_dirs;
}

int main(void)
{
    const char *path = getenv("PATH");
    size_t ndirs = tokenizeEnvPaths(path, pathsarray, MAXARGS);

    for (size_t i = 0; i < ndirs; i++)
    {
        if (pathsarray[i] != NULL)
        {
            char buffer[MAXPATHLEN];
            snprintf(buffer, sizeof(buffer), "%s/%s", pathsarray[i], "ls");
            fprintf(stderr, "---%s\n", pathsarray[i]);
        }
    }
    return(0);
}

出力例:

$ PATH=:$PATH ./sp
Found: .
Found: /Users/jleffler/bin
Found: /usr/informix/11.70.FC6/bin
Found: /usr/gcc/v4.7.1/bin
Found: /usr/informix/11.70.FC6
Found: /Users/jleffler/perl/v5.16.0/bin
Found: /usr/local/bin
Found: /usr/bin
Found: /bin
Found: /usr/gnu/bin
Found: /usr/sbin
Found: /sbin
---./ls
---/Users/jleffler/bin/ls
---/usr/informix/11.70.FC6/bin/ls
---/usr/gcc/v4.7.1/bin/ls
---/usr/informix/11.70.FC6/ls
---/Users/jleffler/perl/v5.16.0/bin/ls
---/usr/local/bin/ls
---/usr/bin/ls
---/bin/ls
---/usr/gnu/bin/ls
---/usr/sbin/ls
---/sbin/ls
$
于 2012-12-08T19:34:20.517 に答える