为什么我的字符串在复制时被截断了?
Why is my string truncated when copied?
我正在尝试查找是否使用 C
(不使用系统调用)安装了 less
。但是我复制变量有问题。字符串的内容是 t运行cated:
int ret;
char * pathValue;
char * pathValue2;
char *token3;
char * new_str ;
int pathlength;
pathValue = getenv ("PATH");
if (! pathValue) {
printf ("'%s' is not set.\n", "PATH");
}
else {
printf ("'%s' is set to %s.\n", "PATH", pathValue);
}
pathlength = sizeof(pathValue)/sizeof(char);
pathValue2 = malloc(sizeof(pathValue));
strncpy(pathValue2, pathValue, pathlength);
printf ("pathValue2 is to %s.\n", pathValue2);
token3 = strtok(pathValue2, ":");
ret = 1;
printf("Looking for less\n");
while( token3 != NULL ) {
printf("Looking for less %s\n", token3);
if((new_str = malloc(strlen(token3)+strlen("/less")+1)) != NULL) {
new_str[0] = '[=10=]';
strcat(new_str,token3);
strcat(new_str,"/less");
printf( " %s\n", new_str );
if (file_exist (new_str)) {
printf("Found less\n");
ret=0;
}
free(new_str);
} else {
printf("malloc failed!\n");
}
token3 = strtok(NULL, ":");
}
free(pathValue2);
如果我运行这个程序,第一个变量是我正确的PATH
但是当我复制它时,它变成了t运行cated。这里有什么问题?
$ ./a.out
'PATH' is set to /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games.
pathValue2 is to /usr/loc.
Looking for less
Looking for less /usr/loc
/usr/loc/less
我相信,问题就出在这里
pathlength = sizeof(pathValue)/sizeof(char);
在这种情况下,pathValue
是一个指针,sizeof(pathValue)
将产生一个只有指针大小的值,而不是 字符串占用的全部内存量.
你在这里想要的是使用 strlen()
代替。
此外,正如下面评论中提到的,C 标准保证 sizeof(char)
将始终产生 1
的值。所以,它可以从计算中删除。/
我正在尝试查找是否使用 C
(不使用系统调用)安装了 less
。但是我复制变量有问题。字符串的内容是 t运行cated:
int ret;
char * pathValue;
char * pathValue2;
char *token3;
char * new_str ;
int pathlength;
pathValue = getenv ("PATH");
if (! pathValue) {
printf ("'%s' is not set.\n", "PATH");
}
else {
printf ("'%s' is set to %s.\n", "PATH", pathValue);
}
pathlength = sizeof(pathValue)/sizeof(char);
pathValue2 = malloc(sizeof(pathValue));
strncpy(pathValue2, pathValue, pathlength);
printf ("pathValue2 is to %s.\n", pathValue2);
token3 = strtok(pathValue2, ":");
ret = 1;
printf("Looking for less\n");
while( token3 != NULL ) {
printf("Looking for less %s\n", token3);
if((new_str = malloc(strlen(token3)+strlen("/less")+1)) != NULL) {
new_str[0] = '[=10=]';
strcat(new_str,token3);
strcat(new_str,"/less");
printf( " %s\n", new_str );
if (file_exist (new_str)) {
printf("Found less\n");
ret=0;
}
free(new_str);
} else {
printf("malloc failed!\n");
}
token3 = strtok(NULL, ":");
}
free(pathValue2);
如果我运行这个程序,第一个变量是我正确的PATH
但是当我复制它时,它变成了t运行cated。这里有什么问题?
$ ./a.out 'PATH' is set to /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games. pathValue2 is to /usr/loc. Looking for less Looking for less /usr/loc /usr/loc/less
我相信,问题就出在这里
pathlength = sizeof(pathValue)/sizeof(char);
在这种情况下,pathValue
是一个指针,sizeof(pathValue)
将产生一个只有指针大小的值,而不是 字符串占用的全部内存量.
你在这里想要的是使用 strlen()
代替。
此外,正如下面评论中提到的,C 标准保证 sizeof(char)
将始终产生 1
的值。所以,它可以从计算中删除。/