如何将字符串块转换为字符串数组

时间:2013-04-14 13:49:52

标签: c arrays string

我有一个字符串块,说“aaa \ 0bbbb \ 0ccccccc \ 0” 我想把它们变成一个字符串数组。 我尝试使用以下代码执行此操作:

void parsePath(char* pathString){
  char *pathS = malloc(strlen(pathString));
  strcpy(pathS, pathString);
  printf(1,"33333\n");
  pathCount = 0;
  int i,charIndex;
  printf(1,"44444\n");
  for(i=0; i<strlen(pathString) ; i++){
      if(pathS[i]=='\0')
      {
       char* ith = malloc(charIndex);
       strcpy(ith,pathS+i-charIndex);
       printf(1,"parsed string %s\n",ith);
       exportPathList[pathCount] = ith;
       pathCount++;
       charIndex=0;
      }
      else{
        charIndex++;
      }
  }

  return;
}

exportPathList是前面代码中定义的全局变量     char * exportPathList [32]; 当使用该函数时,exportPathList [i]包含垃圾。 我做错了什么?

4 个答案:

答案 0 :(得分:1)

首先,由于您的字符串由空字符'\0'分隔,strlen只会报告字符串的大小,直到第一个'\0'strcpy也将复制到第一个空字符。

此外,您无法知道输入字符串以此信息结尾的位置。您需要传入整个大小,或者,例如,使用双重空字符结束输入:

#include <stdio.h>
#include <string.h>
void parsePath(const char* pathString){
    char buf[256]; // some limit
    while (1) {
        strcpy(buf, pathString);
        pathString+=strlen(buf) + 1;
        if (strlen(buf) == 0)
            break;
        printf("%s\n", buf);
    }   
}

int main()
{
    const char *str = "aaa\0bbbb\0ccccccc\0\0";
    parsePath(str);
    return 0;
}

你需要一些realloc来实际创建数组。

答案 1 :(得分:1)

这个问题的答案:

Parse string into argv/argc

处理类似的问题,你可以看看。

您需要知道有多少字符串或同意&#34;字符串结尾&#34;。最简单的是在末尾有一个空字符串:

 aaa\0bbbb\0ccccccc\0\0
                     ^^

P.S。这是家庭作业吗?

答案 2 :(得分:0)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZE 16

char* exportPathList[MAXSIZE] = {0};
size_t pathCount = 0;

void parsePath(char* pathString){
    char *ptop, *pend;

    ptop=pend=pathString;
    while(*ptop){
        while(*pend)++pend;
        exportPathList[pathCount++]=strdup(ptop);
        pend=ptop=pend+1;
    }
}

int main(){
    char textBlock[]= "aaa\0bbbb\0ccccccc\0";
    //size_t size = sizeof(textBlock)/sizeof(char);
    int i;

    parsePath(textBlock);
    for(i=0;i<pathCount;++i)
        printf("%s\n", exportPathList[i]);

    return 0;
 }

答案 3 :(得分:0)

我实现的解决方案确实在字符串的末尾添加了两个'\ 0'并使用它来计算字符串的数量。

我的新实现(路径是字符串数):

void parsePath(char* pathString,int paths){
  int i=0;  
  while (i<paths) {
    exportPathList[i] = malloc(strlen(pathString)+1);
    strcpy(exportPathList[i], pathString);
    pathString+=strlen(pathString);
    i++;
    }  
}

我要感谢所有贡献的人。