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

例如,如果输入是


  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

09-12 20:49