[英]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.