簡體   English   中英

C fscanf讀取指向字符數組的指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM