簡體   English   中英

C 通過標准輸入讀取文件讀取隨機符號

[英]C Reading file via stdin reads random signs

我有通過標准輸入讀取文件並將每個字符一個一個保存到字符數組“adresy”中的程序。 每次在那里放入新字母時,該程序的輸出都是字符數組 adresy。 但是我的輸出有問題。 在我的 txt 文件中有 6 個單詞,文件的每一行包含 1 個單詞。 正如您在輸出中看到的那樣,它讀取不存在的標志,我不知道為什么。 我發現當我改變文件中單詞的順序時,它不會改變任何東西,它無論如何都會讀取那些隨機符號,但只讀取第一個單詞。 有人知道為什么嗎?

全碼

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

文件內容:

布魯莫夫

普拉哈

布拉迪斯拉發

布爾諾

梅澤夫

馬丁

讀取文件的代碼:

                  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

看看你的代碼(不容易,因為我無法理解任何評論..),我認為問題在於你沒有在第一次運行時將 adresy[100] 初始化為 0。 因此,當您使用 printf() 和 strcmp() 時,它取決於它找到的第一個隨機 \\0。 接下來的單詞沒有相同的問題,因為您使用 memset 將數組設置為 0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM