保存指针指向数组的字符串

时间:2014-12-21 05:06:24

标签: c arrays

我试图将字符串从指针保存到数组。但是我的代码输出了分段错误。这是我的代码:

  char timelog[maxline];
  matchescount = 0;
  while ((read = getline(&line, &len, fp)) != -1) {
    struct matches matched = check_match(line,lgd,grd);
    if (matched.status==1)
    {
      strcpy(timelog[matchescount],matched.timelog);
      matchescount++;
    }
  }

这里:matched.timelog="10:24:12"喜欢字符串。我想将它保存到timelog [matchescount]。所以我想从timelog数组中得到这个:

timelog[0]="10:24:12" 

timelog[1]="10:24:13"

更新 我可以存储2d字符串数组吗?

  

char timelog [maxline] [255]

创建

[0][0]="1" [0][1]="0" [0][2]=":" [0][3]="2" [0][4]="4" [0][5]=":" [0][6]="1" [0][7]="2"

[1][0]="1" .......

对吧?

我可以这样存储吗?

  

[0] [0] =" 10:24:12" [0] [1] =" 10:24:13"

     

[1] [0] =" 10:24:14" [1] [1] =" 10:24:15"

3 个答案:

答案 0 :(得分:2)

假设您的时间日志字符串总是看起来像“hh:mm:ss”,您可以

#define MAXTIMELOG 9
#define MAXENTRIES 1000


char timelog[MAXENTRIES][MAXTIMELOG];
matchescount = 0;
while ((read = getline(&line, &len, fp)) != -1) {
    struct matches matched = check_match(line, lgd, grd);
    if (matched.status==1)
    {
        strncpy(timelog[matchescount], matched.timelog, MAXTIMELOG);
        timelog[matchescount][MAXTIMELOG-1] = 0;
        if (++matchescount == MAXENTRIES) {
            ... deal with full array ...
        }
    }
}

答案 1 :(得分:2)

只需制作2D数组。错误是因为你的数组是1D所以你只能在该数组中存储一个字符串。要存储多个进行以下更改。

 char timelog[maxline][10];
  matchescount = 0;
  while ((read = getline(&line, &len, fp)) != -1) {
    struct matches matched = check_match(line,lgd,grd);
    if (matched.status==1)
    {
      strcpy(timelog[matchescount],matched.timelog);
      matchescount++;
    }
  }

<强> 更新:

char timelog[maxline][255]

创建一个char的二维数组.As是一个字符数组,你只能在char的二维数组中存储字符串的si1D数组

timelog[0][0]='a';
timelog[0][1]='b';
timelog[0][2]='c';
timelog[0][3]='d';
timelog[0][4]='e';

这表示你在timelog [0]上有一个字符串“abcde”;

存储2d字符串数组,需要3D字符数组

timelog[maxline][noOfStrings][maxLengthOfEachString];

现在您可以存储2D字符串数组。

strcpy(timelog[0][0],"abcd");
strcpy(timelog[0][1],"efgh");
strcpy(timelog[1][0],"ijkl");
strcpy(timelog[1][1],"xyz");

答案 2 :(得分:0)

实际上,您不应该将字符串复制到预分配的数组中。请改用动态数组:

size_t timelogSize = 8, matchescount = 0;
char** timelog = malloc(timelogSize*sizeof(*timelog));
while ((read = getline(&line, &len, fp)) != -1) {
    struct matches matched = check_match(line,lgd,grd);
    if (matched.status==1) {
        if(matchescount == timelogSize) {
            timelogSize *= 2;
            timelog = realloc(timelog, timelogSize*sizeof(*timelog));
        }
        timelog[matchescount++] = strdup(matched.timelog);
    }
}

这有一个很大的优势,你可以处理任意大小和计数的输入字符串。通过在任何地方执行此操作,您需要一个数组,您可以避免许多等待发生的错误。