Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的字符串分析_C_String - Fatal编程技术网

C语言中的字符串分析

C语言中的字符串分析,c,string,C,String,我正在尝试将字符串传递给chdir()。但是我似乎总是有一些拖尾的东西使chdir()失败 #在第128节中定义 int main(int argc,字符**argv){ 整数计数器; char命令[IN_LEN]; char**tokens=(char**)malloc(sizeof(char)*IN_LEN); 大小路径长度;字符路径[长度]; ... fgets(命令、格式、标准) 计数器=0; tmp=strtok(命令,delim); while(tmp!=NULL){ *(代币+计数

我正在尝试将字符串传递给chdir()。但是我似乎总是有一些拖尾的东西使chdir()失败

#在第128节中定义
int main(int argc,字符**argv){
整数计数器;
char命令[IN_LEN];
char**tokens=(char**)malloc(sizeof(char)*IN_LEN);
大小路径长度;字符路径[长度];
...
fgets(命令、格式、标准)
计数器=0;
tmp=strtok(命令,delim);
while(tmp!=NULL){
*(代币+计数器)=tmp;
tmp=strtok(NULL,delim);
计数器++;
}
if(strncmp(*令牌,cd_命令,strlen(cd_命令))==0){
路径_len=strlen(*(令牌+1));
strncpy(路径*(令牌+1),路径长度-1);
//这是我尝试移除尾部垃圾的地方。。。
//但它在第二个系统上不起作用
if(chdir(路径)<0){
错误字符串=strerror(errno);
fprintf(stderr,“路径:%s\n%s\n”,路径,错误字符串);
}
//只是为了检查chdir是否有效
字符缓冲区[1000];
printf(“%s\n”,getcwd(缓冲区,1000));
}
返回0;
}
必须有更好的方法来做到这一点。有什么可以帮忙的吗?我尝试使用scanf,但当程序调用scanf时,它只是挂起


谢谢

调用strncpy()后,您似乎忘记了在路径字符串中附加一个空“\0”。如果没有空终止符,chdir()不知道字符串的结尾,它只会一直查找,直到找到为止。这会使您的路径末尾出现额外字符。

您的示例中至少有两个问题

第一个问题(导致了显而易见的问题)是使用
strncpy()
,它不一定在复制到的缓冲区末尾放置“\0”终止符。在您的情况下,不需要使用<代码> STRNCYP()/<代码>(我认为这完全是因为您遇到的原因而造成的危险)。您的令牌将由
strtok()
终止“\0”,并且它们保证小于路径缓冲区(因为令牌来自与路径缓冲区大小相同的缓冲区)。只需使用
strcpy()
,或者如果您希望代码能够适应稍后出现的人,并处理缓冲区大小,请使用非标准的
strlcpy()

根据经验,不要使用
strncpy()

代码的另一个问题是
令牌
分配不正确

char** tokens = (char**) malloc(sizeof(char)*IN_LEN);
将分配一个与输入字符串缓冲区一样大的区域,但在该分配中存储的是指向字符串的指针,而不是字符。您将拥有比字符更少的令牌(根据定义),但每个令牌指针可能比字符大4倍(取决于平台的指针大小)。如果字符串中有足够的令牌,则会溢出此缓冲区

例如,假设
IN_LEN
为14,输入字符串为“abcdefg”。如果使用空格作为分隔符,将有7个令牌,这将需要一个包含28字节的指针数组。比调用
malloc()
分配的14个要多出很多

简单更改为:

    char** tokens = (char**) malloc((sizeof(char*) * IN_LEN) / 2);
应分配足够的空间(其中是否存在一个off by one错误?可能需要+1)


第三个问题是,您可能会访问
*令牌
*(令牌+1)
,即使数组中添加了零个或只有一个令牌。在取消引用这些指针之前,您需要添加一些对
计数器
变量的检查。

啊,是的。多么愚蠢的错误啊。也非常感谢。我感到很沮丧。
    char** tokens = (char**) malloc((sizeof(char*) * IN_LEN) / 2);