我的程序没有找到 EOF 符号
My program doesn't find EOF symbol
我有这个程序可以从 .txt 文件中删除所有以相同符号开头和结尾的单词。在我看来它应该可以工作,但是当达到 EOF 并且 ir 向我打印一些奇怪的中文符号时它不会停止...
代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MAX 255
void search(char *symbolMass, FILE *duomFail, FILE *rezFail)
{
int i = 0, k =0, j =0, p = 0;
char symbol = 0;
char *rezMass;
char word[20];
rezMass = (char*)malloc(sizeof(char)*MAX);
while(simbolis != EOF)
{
printf("veikia");
symbol = symbolMass[i];
if (symbol != 32 && symbol != 10 && symbol != EOF)
{
word[j] = symbol;
i++;
j++;
}
else
{
word[j] = symbol;
i++;
if(word [0] == word[j - 1])
{
rezMass[k] = word[j];
k++;
}
else
{
for (p = 0; p <= j; p++, k++)
{
rezMass[k] = word[p];
}
}
j = 0;
}
}
for(i = 0; i <= k; i++)
symbolMass[i] = rezMass[i];
}
int main(int argc, char* argv[])
{
FILE *duom, *rez;
char *symbols;
symbols = (char*)malloc(sizeof(char)*MAX);
if (argc > 1)
{
duom = fopen (argv[1],"r");
rez =fopen (argv[2],"w");
if (duom != NULL)
{
while (symbols != NULL)
{
fgets(symbols, MAX, duom);
search(symbols, duom, rez);
fputs(symbols, rez);
}
fclose(duom);
}
else
{
printf("There is no file with name \"%s\"\n",argv[1]);
}
}
else
{
printf("The command has no arguments.\n");
}
fclose(rez);
free(simboliai);
return 0;
}
它是这样工作的:它扫描符号并将它们放入 "word" 直到它到达 "space"、"new line" 或 "EOF",然后它检查单词是否开始并以相同的符号结尾,如果是,则只打印 "space"、"new line" 或 "EOF",如果不是,则打印整个单词。
哦,代码是用 C 语言编写的(如果重要,可以使用 CodeBlocks)。
那是因为在您传递给 search
函数的缓冲区中 是 没有 EOF
字符。缓冲区 symbolMass
是一个 字符串 并且像 C 中的所有字符串一样,它由特殊的空字符 '[=16=]'
终止(顺便说一下,它恰好与 0
).
我建议你把你的循环改成这样
char symbol;
for (int i = 0; (symbol = symbolMass[i]) != '[=10=]'; ++i)
{
...
}
此外,不要对字符使用 "magic numbers",而是使用实际的字符文字,而不是
if (symbol != 32 && symbol != 10 && symbol != EOF)
做
if (symbol != ' ' && symbol != '\n')
我有这个程序可以从 .txt 文件中删除所有以相同符号开头和结尾的单词。在我看来它应该可以工作,但是当达到 EOF 并且 ir 向我打印一些奇怪的中文符号时它不会停止...
代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MAX 255
void search(char *symbolMass, FILE *duomFail, FILE *rezFail)
{
int i = 0, k =0, j =0, p = 0;
char symbol = 0;
char *rezMass;
char word[20];
rezMass = (char*)malloc(sizeof(char)*MAX);
while(simbolis != EOF)
{
printf("veikia");
symbol = symbolMass[i];
if (symbol != 32 && symbol != 10 && symbol != EOF)
{
word[j] = symbol;
i++;
j++;
}
else
{
word[j] = symbol;
i++;
if(word [0] == word[j - 1])
{
rezMass[k] = word[j];
k++;
}
else
{
for (p = 0; p <= j; p++, k++)
{
rezMass[k] = word[p];
}
}
j = 0;
}
}
for(i = 0; i <= k; i++)
symbolMass[i] = rezMass[i];
}
int main(int argc, char* argv[])
{
FILE *duom, *rez;
char *symbols;
symbols = (char*)malloc(sizeof(char)*MAX);
if (argc > 1)
{
duom = fopen (argv[1],"r");
rez =fopen (argv[2],"w");
if (duom != NULL)
{
while (symbols != NULL)
{
fgets(symbols, MAX, duom);
search(symbols, duom, rez);
fputs(symbols, rez);
}
fclose(duom);
}
else
{
printf("There is no file with name \"%s\"\n",argv[1]);
}
}
else
{
printf("The command has no arguments.\n");
}
fclose(rez);
free(simboliai);
return 0;
}
它是这样工作的:它扫描符号并将它们放入 "word" 直到它到达 "space"、"new line" 或 "EOF",然后它检查单词是否开始并以相同的符号结尾,如果是,则只打印 "space"、"new line" 或 "EOF",如果不是,则打印整个单词。 哦,代码是用 C 语言编写的(如果重要,可以使用 CodeBlocks)。
那是因为在您传递给 search
函数的缓冲区中 是 没有 EOF
字符。缓冲区 symbolMass
是一个 字符串 并且像 C 中的所有字符串一样,它由特殊的空字符 '[=16=]'
终止(顺便说一下,它恰好与 0
).
我建议你把你的循环改成这样
char symbol;
for (int i = 0; (symbol = symbolMass[i]) != '[=10=]'; ++i)
{
...
}
此外,不要对字符使用 "magic numbers",而是使用实际的字符文字,而不是
if (symbol != 32 && symbol != 10 && symbol != EOF)
做
if (symbol != ' ' && symbol != '\n')