gpt4 book ai didi

C fscanf 读取指向字符数组的指针

转载 作者:行者123 更新时间:2023-12-04 02:09:33 28 4
gpt4 key购买 nike

我正在尝试使用 fscanf 将文件中的行读取到指向字符数组的指针中。我在打印时遇到段错误。我究竟做错了什么?我应该使用 fscanf 以外的函数吗?

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

#define MAXSTACK 100
#define MAXLENGHT 100

void main(int argc, char * argv[]){

char *filename;
FILE *fp;
char *lines[MAXSTACK];
char * command;
int top = 0;
int numlines = 0;

if(argc < 3){

fprintf(stderr,"error: Not enough arguments provided\n");
exit(1);
}

filename = argv[1];
command = argv[2];

if ( (fp = fopen(filename,"r")) == NULL ){

fprintf(stderr,"error: Cannot open file %s\n",filename);
exit(1);
}
else{

for(int i = 0; i < 3; i++){

fscanf(fp,"%s",lines[i]);
// printf("%s\n",lines[i]);
}

char **ptr2 = lines;
for (int i = 0; i < 2; i++){

printf("%s\n", ptr2[i]);
}

if (strcmp(command,"pop")==0){

//pop(lines);
}else if (strcmp(command,"print_top")==0){
//print_top();

}else if(strcmp(command,"swap_top")==0){

}
}
}

最佳答案

您可能想使用 fgets 读取行:

/* Read a single line into a temporary buffer */
char lineBuffer[MAX_LINE_LENGTH];
while (fgets(lineBuffer, sizeof(lineBuffer), fp) != NULL) {
/* Process the read line */
}

一旦你在临时缓冲区中读取了一行,你就可以使用 malloc 将读取的字符串深度复制到你在堆上分配的内存中(或者你可以只使用 strdup ),然后您可以将指向该内存的指针存储到您的 lines 数组中:

 /* Inside the body of the while loop */

/*
* Deep copy current line into the string pointer array.
* strdup = malloc + strcpy
* Note that free is required to release memory!
*/
lines[currLineIndex] = strdup(lineBuffer);

currLineIndex++;

注意当你写这样的代码时:

char *lines[MAXSTACK];

您正在堆栈上分配一个 MAXSTACK 项数组,每个项都是一个 char* 指针。但是随后您必须为这些指针赋予一些有意义的值(例如:从堆中分配一些内存并指向该内存)。

当然,完成后,您必须扫描整个数组并在每个元素指针上调用 free 以避免内存泄漏。

此外,一个好的编码习惯是在使用数组之前清除数组中的指针,例如:

memset(lines, 0, sizeof(lines));

关于C fscanf 读取指向字符数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40017596/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com