字符串与char*foo[]
这是以下代码的输出,但我希望它是正确的路径。 奇数索引(如pathsarray[1]=ls/ls)的输出有什么错误字符串与char*foo[],c,arrays,string,unix,pointers,C,Arrays,String,Unix,Pointers,这是以下代码的输出,但我希望它是正确的路径。 奇数索引(如pathsarray[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]//路径 char*path=getenv(“路径”); 标记化路径(路径); int i; 对于(i=
---/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]//路径
char*path=getenv(“路径”);
标记化路径(路径);
int i;
对于(i=0;i而言,pathsarray
中的每个字符串的末尾似乎都没有多余的空间,这意味着没有空间可用于将任何内容连接到字符串的末尾。由于您不进行边界检查,因此您的strcat
会在超过字符串末尾的内存上跺脚,并损坏其他内存(包括同一数组中的其他字符串)
pathsarray
中的字符串是如何分配和分配的?您不显示该部分。它们是malloc
ed吗
如果要在创建字符串后将3个字符追加到字符串中,则需要确保为该字符串分配的字节数至少比其初始内容所需的字节数多3个……否则,您需要在以后向字符串追加内容时为该字符串重新分配更大的缓冲区。以下是SSCCE()
你从来没有初始化过pathsarray。@melpomene:酷,我不知道,有这样一个站点!@stark我初始化过,但我想我不能正确地进行初始化。上面写着“未初始化”。我如何才能初始化malloc char*foo[]数组?数组本身的大小是固定的(MAXARGS
)。我说的是分配放入其中的单个字符串。您可能不想使用mallocchar*foo[]
array。除此之外,您需要知道数组有多大。
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]);
}
}
#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
$