C语言 保存指针指向数组的字符串



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

  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[0]="10:24:12" 
timelog[1]="10:24:13"

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

字符时间日志[最大线][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">

只需使您的数组为2D即可。该错误是因为您的数组是 1D 的,因此您只能存储该数组的一个字符串 int。若要存储多个,请进行以下更改。

 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 的 2D 数组。由于字符串是一个字符数组,因此您只能将字符串的si1D数组存储在字符的2d数组中

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

假设你的时间日志字符串总是看起来像"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 ...
        }
    }
}

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

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

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

最新更新