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

标签 c file stdin

我有一个程序,通过标准输入读取文件并将每个字符一一保存到字符数组“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

praha

bratislava

brno

medzev

martin

读取文件的代码:

                  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。

关于C 通过 stdin 读取文件读取随机符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47062692/

相关文章:

c - 将传输结束写入正在运行的进程的标准输入

python - asyncio 无法在 Windows 上读取标准输入

ffmpeg 可以解析/解码 AVCC 格式的数据包吗?

c - 我认为我超出了此过程的可用内存。有人可以看一下并验证吗?

python - 为什么使用 int() 内置从 .txt 文件读取部分行时抛出 ValueError ?

c - 在 C 中处理多字节(非 ASCII)字符

c 语言 scanf - fflush(stdin) - 不起作用

c - 在c中读取和写入位图

c - C中从父进程到子进程连续写入

带有效载荷的 C 双字面值 NaN