gpt4 book ai didi

c - 如何在C中解析数组

转载 作者:行者123 更新时间:2023-11-30 15:01:22 24 4
gpt4 key购买 nike

我想将输入字符串(路径)解析到数组中。

例如,如果输入是

cd("C/Hra/Halo 4/Hra");

数组应包含 {"C","Hra","Halo 4","Hra"},但它包含 {"C","Hra","Halo 4、“HraC”}。我的 friend 建议我为每个字符串添加 "\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];

同样,charfoldersName[count][255];也需要更改大小:charfoldersName[count+1][255];。通过这种方式,您计算 / 时,最终可能会得到远远大于所需值的 count 值。例如,路径可以以尾随 / (/usr/bin/) 结尾,路径中可以有多个连续的 / ( /usr//bin//lib//) 等。当您在 / 上标记字符串时,同样可能会出现问题。

strtok() 返回一个以空字节结尾的字符串。因此,您不需要执行以下操作:strcat(foldersName[count],"\0");

您的程序还包含其他几个小问题/限制:

  • 使用size_t来存储strlen()的返回值。
  • 请注意,strtok() 会修改其输入(这就是为什么您必须复制路径的原因)。
  • foldersName[count][255]; 分配 variable length array (VLA)。如果 path 非常长(包含太多 /),则分配可能会失败,并且不易检测到。
  • 如果任何路径组件的长度超过 255,您将得到 buffer overflow .

关于c - 如何在C中解析数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41470864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com