我想将输入字符串(路径)解析到数组中。
例如,如果输入是
cd(“ C / Hra / Halo 4 / Hra”);
该数组应包含{"C","Hra","Halo 4","Hra"}
,但它包含{"C","Hra","Halo 4,"HraC"}
。
我的朋友建议我把"\0"
每串,但它不工作。
有人可以建议我如何修理吗?
我的代码:
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
void cd(char* path){
printf("Path %s \n",path);
int count = 0;
int i = 0;
int length = (int)strlen(path);
for(i;i<length;i++){
if(path[i]=='/')
count ++;
}
char foldersName[count][255];
char str[strlen(path)];
strcpy(str,path);
char * pch;
pch = strtok (str,"/");
count = 0;
while (pch != NULL)
{
strcpy(foldersName[count],pch);
strcat(foldersName[count],"\0");
pch = strtok (NULL, "/");
count ++;
}
printf("----------------Tokens-----------\n");
for(i =0;i<count;i++){
printf("%s \n",foldersName[i]);
}
}
int main(int argc, char *argv[])
{
cd("C/Hra/Halo 4/Hra");
}
最佳答案
str
的空白字节没有空间。
更改
char str[strlen(path)];
至
char str[strlen(path)+1];
类似地
char foldersName[count][255];
需要尺寸变化太:char foldersName[count+1][255];
。有了这样,你计数/
,你可以用count
值远远超过了必要的大endup。例如,一个路径可以用一个尾随/
(/usr/bin/
),可以有多个连续的/
在一个路径(/usr//bin//lib//
)等。同样,当你记号化的字符串可以造成问题。/
返回以空字节终止的字符串。所以,你不需要做:strtok()
。您的程序还包含其他一些小问题/限制:
使用
strcat(foldersName[count],"\0");
存储size_t
的返回值。请注意,
strlen()
会修改其输入(这就是为什么您必须复制strtok()
的原因)。path
分配variable length array(VLA)。如果foldersName[count][255];
太长(包含太多path
),则分配可能失败,无法轻易检测到。如果任何路径分量长于255,则您将具有buffer overflow。