C通过stdin读取文件读取随机符号

时间:2017-11-01 19:56:07

标签: c file stdin

我有程序通过stdin读取文件并将每个char逐个保存到char数组" adresy"。每当新信件放入那里时,该程序的输出就是char数组adresy。但我的输出有问题。在我的txt文件中有6个单词,每行文件包含1个单词。正如你在输出中看到的那样,它会显示不存在的迹象,我不知道为什么。我发现当我改变文件中的单词顺序时,它不会改变任何东西,它无论如何都会读取这些随机符号,但只能用第一个单词。有人知道为什么吗?

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

1 个答案:

答案 0 :(得分:1)

看看你的代码(不容易,因为我无法理解任何评论......),我认为问题在于你没有将adresy [100]初始化为0你跑。所以当你使用printf()和strcmp()时,它取决于它找到的第一个随机\ 0。 接下来的单词没有相同的问题,因为你使用memset将数组设置为0。