我有程序通过stdin读取文件并将每个char逐个保存到char数组" adresy"。每当新信件放入那里时,该程序的输出就是char数组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);
}
文件内容:
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
答案 0 :(得分:1)
看看你的代码(不容易,因为我无法理解任何评论......),我认为问题在于你没有将adresy [100]初始化为0你跑。所以当你使用printf()和strcmp()时,它取决于它找到的第一个随机\ 0。 接下来的单词没有相同的问题,因为你使用memset将数组设置为0。