Search code examples
cfilestdin

C Reading file via stdin reads random signs


I have program that reads file via stdin and saves each char one by one into char array "adresy". Output of this program is char array adresy everytime new letter is put in there. But I have a problem with output. In my txt file there are 6 words, each line of file contains 1 word. As you can see in output, it reads signs that are not there and I dont know why. I found out that when I change order of words in file it doesnt change anything and it reads those random signs anyway but only with first word. Does someone know why?

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);
}

Content of file:

broumov

praha

bratislava

brno

medzev

martin

Code that reads file:

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

Output of my program:

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

Solution

  • Taking a look at your code (not easy, as I couldn't understand any of the comments..), I think the problem is that you don't initialize adresy[100] to 0 the first you run. So when you use printf() and strcmp(), it depends on the first random \0 it finds. The next words don't have the same issue, since you use memset to set the array to 0's.