2012-10-23 4 views
1

나는 파일 내의 텍스트 문자열을 찾고 다른 문자열로 바꾸는 작은 C 프로그램을 작성하고있다. 그러나 이것을하면서 세분화 오류가 계속 발생하고 어떤 이유에서든 내 버퍼 (c) 내 fgets 전화 후 비어 있습니다.텍스트를 검색하고 바꾼다

#include <stdio.h> 
#include <stdlib.h> 
#include <dirent.h> 
#include <string.h> 



/* 
*program replaces all strings that match a certain pattern within a file 
*/ 

int main(int argc, char** argv) 
{ 
    // check if there are correct amount of arguments 
    if(argc != 4) 
    { 
      printf("Error, incorrect amount of input arguments!\n"); 
      return 1; 
    } // end if 

    // initializers 
    int i; 
    char* temp; 
    FILE* searchFile; 
    char* c = malloc(sizeof(char)); 
    char* fileName = malloc(sizeof(argv[1])); 
    char** searchWord = malloc(sizeof(argv[2])); 
    char* replaceWord = malloc(sizeof(argv[3])); 

    fileName = argv[1]; 
    *searchWord = argv[2]; 
    replaceWord = argv[3]; 

    // checks to see if searchWord isnt too big 
    if(strlen(*searchWord) > 256) 
    { 
      printf("Error, incorrect amount of input arguments!\n"); 
      return 1; 
    } 

    // opens file 
    searchFile = fopen(fileName,"r+"); 

    // searches through file 
    do 
    { 
      fgets(c, 1, searchFile); 

      i = 0; 
      while(i < strlen(*searchWord)) 
      { 
        printf("search character number %i: %c\n", i, *searchWord[i]);  

        /* 
        * finds number of letters in searchWord 
        * by incrementing i until it is equal to size of searchWord 
        */ 
        if(strcmp(c,searchWord[i])) 
        { 

          i++; 
        } 

        // replaces searchWord with replace word 
        if(i == (strlen(*searchWord))) 
        { 
          printf("inside replace loop\n"); 
          memcpy(searchWord, replaceWord,(sizeof(replaceWord)/sizeof(char))+1); 
          printf("The search term (%s) has been replaced with the term: %s!\n",*searchWord,replaceWord); 
        } 
      } 
    }while(strlen(c) > 0); 

    // closes file 
    fclose(searchFile); 
} 
+0

왜 fgets로 한 문자를 읽는 중입니까? 이 경우 fgetc를 사용하면됩니다. –

+0

리차드의 한마디 한마디 만 읽었을 때, 왜 그걸 위해 메모리를 할당해야합니까? 'char c;를 선언하고 그 문자에 대한 포인터가 필요할 때'& c'를 사용하십시오. –

+0

두 번째로 살펴볼 것은'sizeof'와'strlen'의 차이점입니다. –

답변

1

당신은는 fgets 1의 크기를 전달하는 :

여기 내 코드입니다. 그러나 fgets 함수는 주어진 스트림의 크기로 지정된 문자 수보다 많지 않은 하나를 읽습니다. 따라서 1의 크기를 전달하면 0 문자를 읽습니다. 읽는 이유가 하나 더 적기 때문에 null 'end of line'문자가 남는 공간이 있습니다.

fgets 함수는 파일 끝에 또는 오류시 줄 바 Y 기 문자가있는 경우 읽기를 중지하고 줄 YY 기가있는 경우 계속 읽습니다. 따라서 문자열에있을 것으로 기대되는 많은 문자와 newline을위한 문자와 null 'end of line'문자를 얻기 위해 malloc을 사용해야합니다.

몇 가지 다른 점에 유의하십시오. 다음 두 명령문 중 첫 번째 명령문은 먼저 파일 이름을 저장할 공간을 할당 한 다음 파일 이름 포인터를 가리 키도록 지정합니다. 두 번째는 다음을 가리 키도록 파일 이름 포인터를 가리키는 프로그램에 대한 첫 번째 아규먼트가 포함 된 문자열을 전달 :

char* fileName = malloc(sizeof(argv[1])); 
fileName = argv[1]; 

어느 단지 바로 거기에 파일 이름 포인터를 가리키고있는 메모리를 할당하지 않습니다

char* fileName = argv[1]; 

또는 당신이 실제로 할당 된 메모리를 필요로하는 경우, 문자열의 내용을 복사 할 두 번째 줄 변경 : m를 할당 할 수

char* fileName = malloc(sizeof(argv[1])); 
strcpy(fileName,argv[1]); 

또는 더 쉽게 사용에서는 StrDup을 emory를 복사 한 다음 내용을 복사하십시오.

char* fileName = strdup(argv[1]); 
관련 문제