如何在C

时间:2017-01-04 18:30:33

标签: c arrays string parsing

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

例如,如果输入是

  

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");

}

1 个答案:

答案 0 :(得分:1)

str没有空字节。

更改

   char str[strlen(path)];

   char str[strlen(path)+1];

同样char foldersName[count][255];也需要改变大小:char foldersName[count+1][255];。顺便说一句,算上/,你可能会得到一个远远超过必要值的count值。例如,路径可能以尾随//usr/bin/)结尾,路径中可能有多个连续//usr//bin//lib//)等。同样可能构成在/上标记字符串时出现问题。

strtok()返回一个空字节终止的字符串。因此,您无需执行:strcat(foldersName[count],"\0");

您的计划也包含其他一些小问题/限制:

  • 使用size_t存储strlen()的返回值。
  • 请注意,strtok()会修改其输入(这就是您必须制作path副本的原因。
  • foldersName[count][255];分配variable length array(VLA)。如果path非常长(包含太多/),则分配可能会失败,无法轻易检测到。
  • 如果任何路径组件长于255,您将拥有buffer overflow