2017-11-01 3 views
-2

stdin을 통해 파일을 읽고 각 char을 char 배열 "adresy"에 하나씩 저장하는 프로그램이 있습니다. 이 프로그램의 출력은 새로운 글자가 입력 될 때마다 char array adresy입니다. 하지만 출력에 문제가 있습니다. 내 txt 파일에는 6 개의 단어가 있으며 파일의 각 행에는 1 개의 단어가 들어 있습니다. 출력에서 볼 수 있듯이, 거기에없는 표지판을 읽습니다. 이유는 모르겠습니다. 나는 파일에서 단어의 순서를 바꿀 때 아무 것도 바꿀 수 없다는 것을 알았고 어쨌든 첫 번째 단어로만 임의의 기호를 읽는다. 누군가 왜 그 이유를 알고 있습니까? 파일의C stdin을 통해 파일을 읽는 중 임의의 기호가 표시됨

whole code

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

main (int argc, char *argv[]) 
{ 
    char *search; //vyhladavanie zadane uzivatelom 
    search=argv[1]; //  ulozenie vyhladavaneho vyrazu (b, br, brn, atď)  
    int searchLen=strlen(search); // dlzka search 
    char adresy[100]; //subor na docasne uchovanie adries z txt suboru 
    char enable[42]=""; //vystup povolenych znakov 
    int enableLen=strlen(enable); //dlzka enable 
    printf("dlzka enable: %d\n", enableLen); 
    char adresyArray[100]; //ulozenie text suboru 
    char slovo[100];  //ak search vyhovuje len 1 adresa, ulozi sa sem 
    int thisWord=0;   //tato premenna urcuje ktore adresy sa ulozia do slovo, v tomto pripade len ak kontrola bola uspesna 

    int found=0;   //mnozstvo najdenych vyhovujucich vyrazov 
    int canCheck=1;  //kontrola je mozna len ak x je prvy znak suboru alebo predchadzajuci znak bol \n 
    int canEnable=0; //hodnota urcuje ci sa kontrola so search vydarila, ak ano, ulozi sa nasledujuci znak c 
    int x; //ulozisko jednotlivych znakov zo suboru 
    int i=0; //index pre adresy 
    // int k=0; 
    while ((x = getchar()) != EOF) //cyklus beží kym sa nedostane ku koncu "suboru", kym nenajde EOF znak; uklada jednotlive znaky suboru do x 
    { 

     char c=x; //konvertovanie int na char 
     adresy[i]=c; // ulozi znak x do adresy na indexe i 
     //adresyArray[k]=c; 
     //k++; 
     i++; // zvyšenie indexu o 1 (posunutie doprava) 
     if(canEnable==1)  //ak posledna kontrola bola uspesna, ulozi sa znak do enable 
     { 
      enableLen=strlen(enable); 
      printf("dlzka enable po uspesnej kontrole: %d\n", enableLen); 
      enable[enableLen]=c;   //ulozenie znaku c do enable na koniec arrayu 
      printf("enable po uspesnej kontrole: %s\n", enable); 
      canEnable=0; //"zresetovanie" aby sa nezapisali 2 znaky za sebou 
      thisWord=1; 
      found++; //pocet vyhovujucich adries sa navyšši 
     } 
     if(c!='\n')  //kontrola prebieha len ak aktualny znak nie je \n 
     {    
      int control=strcmp(search, adresy); //kontrola search a aktualnej casti adresy 
      if(control==0)     //ak sa rovnaju, canEnable sa nastavi na hodnotu 1 aby sa pri dalsom behu cykla ulozil znak 
      { 
       printf("kontrola prebehla uspesne: %s\n", adresy); 
       canEnable=1; 
      }    
      else 
      { 
       printf("kontrola prebehla neuspesne: %s\n", adresy); 
      } 
     } 
     else   //ak sa c rovna \n, nastavi sa i na nulu a obsah adresy sa vymaze 
     { 
      printf("posledna adresa: %s\n", adresy); 
      if(found==1 && thisWord==1) 
      { 
       sprintf(slovo, "Found: %s", adresy); 
      } 

      memset(adresy, 0, sizeof(adresy)); 
      i=0; 
      thisWord=0; 
     } 
    } 
    /* if(strstr(adresy, search)!=NULL) 
    { 
     sprintf(slovo, "Found: %s", adresy); 
    } 
    printf("najdene: %d\n", found); 
    for(int i=0;i<strlen(enable);i++) 
    { 
     for(int j=i+1;j<strlen(enable);j++) 
     { 
      if(enable[i]>enable[j]) 
      { 
       char a=enable[i]; 
       enable[i]=enable[j]; 
       enable[j]=a; 
      } 
     } 
    }*/ 
    printf("povolene: %s\n", enable); 



    return (EXIT_SUCCESS); 
} 

내용 :

BROUMOV

프라하

브라 티 슬라바

브르노

파일을 읽고 medzev

마틴

코드 : 내 프로그램의

    while ((x = getchar()) != EOF) 
        char c=x; 
        adresy[i]=c; skontrola prebehla neuspesne: 

출력 :

b$ 
kontrola prebehla neuspesne: br 
kontrola prebehla neuspesne: bro 
kontrola prebehla neuspesne: brou 
kontrola prebehla neuspesne: broumŞ■(
kontrola prebehla neuspesne: broumo■(
kontrola prebehla neuspesne: broumov(
posledna adresa: broumov 

kontrola prebehla neuspesne: p 
kontrola prebehla neuspesne: pr 
kontrola prebehla neuspesne: pra 
kontrola prebehla neuspesne: prah 
kontrola prebehla neuspesne: praha 
posledna adresa: praha 

kontrola prebehla uspesne: b 
dlzka enable po uspesnej kontrole: 0 
enable po uspesnej kontrole: r 
kontrola prebehla neuspesne: br 
kontrola prebehla neuspesne: bra 
kontrola prebehla neuspesne: brat 
kontrola prebehla neuspesne: brati 
kontrola prebehla neuspesne: bratis 
kontrola prebehla neuspesne: bratisl 
kontrola prebehla neuspesne: bratisla 
kontrola prebehla neuspesne: bratislav 
kontrola prebehla neuspesne: bratislava 
posledna adresa: bratislava 

kontrola prebehla uspesne: b 
dlzka enable po uspesnej kontrole: 1 
enable po uspesnej kontrole: rr 
kontrola prebehla neuspesne: br 
kontrola prebehla neuspesne: brn 
kontrola prebehla neuspesne: brno 
posledna adresa: brno 

kontrola prebehla neuspesne: m 
kontrola prebehla neuspesne: me 
kontrola prebehla neuspesne: med 
kontrola prebehla neuspesne: medz 
kontrola prebehla neuspesne: medze 
kontrola prebehla neuspesne: medzev 
posledna adresa: medzev 

kontrola prebehla neuspesne: m 
kontrola prebehla neuspesne: ma 
kontrola prebehla neuspesne: mar 
kontrola prebehla neuspesne: mart 
kontrola prebehla neuspesne: marti 
kontrola prebehla neuspesne: martin 
posledna adresa: martin 
+3

실제 코드를 나타내십시오. 읽기 : [mcve] –

+0

adresy [] 배열은 어떻게 정의됩니까? 충분히 길어? – Bachman

+0

@Bachman char adresy [100]; – chiro

답변

1

당신의 코드를 (쉽게 이해할 수 없기 때문에) 이해할 수 없으므로, 문제는 처음 실행하는 adresy [100]을 0으로 초기화하지 않는다고 생각합니다. 그래서 printf()와 strcmp()를 사용할 때 발견 된 첫 번째 무작위 \ 0에 의존합니다. memset을 사용하여 배열을 0으로 설정 했으므로 다음 단어에는 동일한 문제가 없습니다.

+0

OK, @Michi가 댓글에 답했습니다. 나는 타이핑을하는 동안 무시했다. – Bachman

+1

이것은 OP가 동의하는 한 여전히 좋은 답변으로 남아 있습니다. +1 – Michi