我正在尝试将字符串从指针保存到数组。但是我的代码输出分段错误。这是我的代码:
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);
}
}
这有一个很大的优势,你可以处理任意大小和计数的输入字符串。通过在需要数组的任何地方执行此操作,您可以避免许多等待发生的错误。