准确地说,我正在尝试从文件A复制到文件B,每个单词中都没有'e'和't'字样(the,peter等),程序运行正常,但是在outfile的最后我得到了一个奇怪的信号。
Input: What says Lucentio to this shame of ours?
Output: What says to this shame of ours?˙
(你能看到角色˙
吗?)
我不想要它,我不知道它是什么,但它不是EOF,我试图从复制中排除它并且它不起作用。我需要一些帮助。
代码:
char signHold[1];
int main(int *argc, char** argv)
{
FILE* infile;
FILE* outfile;
char* string = NULL;
if(argc != 3)
{
printf(stderr,"Error: Improper number of arguments");
return EXIT_FAILURE;
}
remove(argv[2]);
infile = fopen(argv[1],"r");
while(feof(infile) == 0)
{
string = getWord(infile);
if(checkDenied(string))
addToFile(outfile, argv[2], string);
addToFile(outfile, argv[2], signHold);
}
fclose(infile);
free(string);
return EXIT_SUCCESS;
}
char* getWord(FILE* ptr)
{
char* tempString;
size_t memSize = 0;
int c;
tempString = expandRealloc(NULL,sizeof(char));
while(c = fgetc(ptr))
{
if(isalpha(c) != 0)
{
tempString = expandRealloc(tempString, (memSize+1)*sizeof(char)+1);
tempString[memSize] = c;
memSize++;
}
else
{
signHold[0] = c;
break;
}
}
tempString[memSize] = '\0';
return tempString;
}
short int checkDenied(const char* str)
{
int i;
i = strspn("e", str);
if(i >= 1)
{
i = strspn("t", str);
if(i >= 1)
{
return EXIT_SUCCESS;
}
}
return EXIT_FAILURE;
}
short int addToFile(FILE* ptr, char* directory, char* text)
{
ptr = fopen(directory,"a+");
fprintf(ptr,"%s", text);
fclose(ptr);
return EXIT_SUCCESS;
}
答案 0 :(得分:0)
首先,假设fgetc
在文件末尾返回0
,但事实并非如此。它返回EOF
。也许您正在阅读EOF
,将其分配给一个字符,即signHold[0]
(由于EOF
不适合char
,可能会导致任何内容)
然后你继续打印signHold
,其中包含一个随机字符,然后是谁知道,因为字符串不是NUL终止的(它的大小是1,它的第一个字符不是'\0'
。也就是说,你正在打印任何可能发生在signHold
之后的东西。(顺便说一下,这也是未定义的行为)。
答案 1 :(得分:0)
这是状态机。让它使用可变大小的缓冲区给读者留下了一个练习; - )
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, char **argv)
{
FILE *infile;
FILE *outfile;
char buff[100];
size_t len,idx;
int ch, state;
if(argc != 3)
{
fprintf(stderr,"Error: Improper number of arguments");
return EXIT_FAILURE;
}
infile = fopen(argv[1],"r");
outfile = fopen(argv[2],"w");
len = 0;
for (state=0; state >= 0; ) {
ch = fgetc(infile);
if (isalpha(ch)) {
if (ch == 'e') state |= 1;
else if (ch == 't') state |= 2;
if (state != 3) buff[len++] = ch;
continue;
}
/* no character, this must be the end of a word. */
if (state != 3) for(idx=0; idx < len; idx++ ) {
fputc(buff[idx], outfile);
}
if (ch == EOF) {state = -1; continue;}
fputc(ch, outfile);
len = 0; state = 0;
}
fclose(infile);
fclose(outfile);
return EXIT_SUCCESS;
}
答案 2 :(得分:0)
我相信它是存储在signHold [1]中的垃圾记忆。你只允许1个字符而不是NUL终止它。这意味着当你写出问号时,它也会在第一个'\ 0'之前写出任何后面的内存。