[英]C fscanf read pointer to array of characters
我正在嘗試使用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));
fscanf("%s", lines[i])
將讀取一系列非空白字符(注意,不是整行)到由lines[i]
指向的內存中。 問題是,您沒有設置lines[i]
指向任何內存,這就是為什么出現段錯誤的原因,您要求將字符序列復制到某個未定義的位置。
如果替換了字符指針數組的聲明,則char *lines[MAXSTACK];
,聲明了字符數組char lines[MAXLENGTH][MAXSTACK]
的數組,則lines[i]
將是MAXLENGTH
字符的數組,其中fscanf("%s", lines[i])
可以復制到沒有段錯誤。
現在的問題仍然存在,如果字符串fscanf嘗試讀取的長度超過MAXLENGTH
什么? 答案是,將讀取的字符超出了可容納到lines[MAXLENGTH]
數組中的lines[MAXLENGTH]
,您將得到所謂的緩沖區溢出。 為了防止這種情況,可以使用fscanf("%100s", lines[i])
將fscanf
從字符串讀取的最大字符數限制為例如100個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.