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?
#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
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.