2014-10-03 5 views
1

words.txt에 "banana test apple"이 포함 된 파일의 단어를 바꿀 때 찾고 있습니다 -> "banana Replaced! apple"대체 할 단어를 stdin (이 경우 "test")에 대한 인수C - 교체를위한 더 나은 방법

내 코드가 잘못 될지 잘 모르겠지만 getchar() 함수를 얻는 것보다 더 나은 방법이 있는지 궁금합니다. 당신이 문자를 백업 할 수 없기 때문에 혼란스럽고 성가시다.

제안 사항? 감사합니다

$ ./a.exe test < words.txt 


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

    int main(int argc, char** argv) { 
     int c = getchar();  
     int counter = 0; 


     int i,index; 
     for (i = 1; i < argc; i++){ 
      for (index = 0; index < strlen(argv[i]); index++){ 
       while (c == argv[i][index]){ 
        counter++; 
        c = getchar(); 
        index++; 
        if (counter == strlen(argv[i])){ 
         printf("Replaced!"); 
        } 
       } 
       printf("%c ",c); 
       c = getchar(); 
       counter = 0; 
      } 
     } 
     return (0); 
    } 
+0

명백한 제안는 fgets'과 전체 라인을()'를 읽고 다음 (아마도 않는 strstr()''과)들을 검색 할 단어를 찾기 위해 교체 한 다음 단어 앞에 자료를 인쇄하는 것입니다 행에서 일치하는 단어 다음부터 검색을 다시 시작하기 전에 대체 텍스트 (''testing, 1, 2, 3, tested! '를 포함하는 행은''로 끝남'', 1, 2, 3, Exposed –

+1

코드가 구현한다고 생각하는 알고리즘을 설명하거나 적어도 코멘트를 추가 할 수 있습니까? –

+0

프로그램에 대한 모든 입력과 질문 할 때 생성되는 출력을 제공하십시오. 실행중인 명령 줄을 보여 주지만 입력 및 출력을 보여줍니다.이 명령 줄과 코드를 사용하면 words.txt의 내용을 stdin *으로 파이프합니다 (그래서 getchar() 호출을위한 데이터 소스) * 그리고 나서 argv [1] "test"의 문자를 반복하여 t-e-s-t를 얻는다. 그것은 당신의 묘사와 결코 일치하지 않습니다. @DavidSwwartz가 말했듯이, 적어도 당신의 오해에 대해 의견을 말하면서 우리는 그것들을 처리 할 수있는 기회를 갖습니다. – HostileFork

답변

1

나는 다음과 같이 할 것 :

  1. strstr
  2. 를 사용하여 키 작업 (시험)을 찾고 fgets
  3. 를 사용하여 버퍼에있는 모든 파일을 읽을로 교체하여 새 문자열 사용 strncpy
  4. 원하는대로 무엇이든 파일에 쓰거나 출력하십시오.
한 번에 한 마디 읽을 scanf을 사용할 수
0

: 당신이, 당신은 m 할당 할당 문자를 이용할 수있는 최신 POSIX 규격을 준수하는 현대적인 시스템을 사용하는 경우

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

int main(int argc, char *argv[]) 
{ 
    char wordbuffer[100]; 
    while (scanf("%99s", wordbuffer) == 1) 
    { 
     int replace = 0; 
     for (int i = 1; i < argc && !replace; i++) 
      if (strcmp(wordbuffer, argv[i]) == 0) 
       replace = 1; 

     if (replace) 
      printf("Replaced! "); 
     else 
      printf("%s ", wordbuffer); 
    } 
} 

, 적절한 공간을 확보하여 임의의 최대 문자 수를 사용할 필요가 없습니다.

int main(int argc, char *argv[]) 
{ 
    char *wordbuffer; 
    while (scanf("%ms", &wordbuffer) == 1) 
    { 
     int replace = 0; 
     for (int i = 1; i < argc && !replace; i++) 
      if (strcmp(wordbuffer, argv[i]) == 0) 
       replace = 1; 

     if (replace) 
      printf("Replaced! "); 
     else 
      printf("%s ", wordbuffer); 

     free(wordbuffer); 
    } 
}