【问题标题】:How to parse an array in C如何在C中解析数组
【发布时间】:2017-01-04 18:30:33
【问题描述】:

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

例如,如果输入是

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

}

【问题讨论】:

  • char foldersName[count][255];char str[strlen(path)]; --> char foldersName[count+1][255];char str[length+1];

标签: c arrays string parsing


【解决方案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//) 等。当您对@ 上的字符串进行标记时,同样可能会造成问题987654334@.

strtok() 返回一个以空字节结尾的字符串。所以,你不需要这样做:strcat(foldersName[count],"\0");

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多