【发布时间】:2023-03-08 18:36:01
【问题描述】:
我正在尝试在 C 中创建一个从文件读取输入的程序,让它成为 Input.inp,其中包含带有用空格和制表符分隔的单词的字符串,可能是多个,然后写入文件 Output.out , 每个单词在一行。例如,输入文件包含
Hi my name is Yang
那么输出文件将如下所示
Hi
my
name
is
Yang
此外,如果程序到达文件结尾或到达“#”,程序将停止读取。
下面是我的代码。我从文件中获取字符,然后检查它是“#”还是文件结尾。如果不是,那么它将检查字符是空格、制表符还是行尾。如果不是,则该字符将被放入字符串“word”中。现在,如果我们到达空格、制表符或行尾,那么我将打印字符串“word”,将pos 设置回 0 并继续执行此操作。但这不起作用。有人可以解释为什么我的代码会失败并为我提供如何解决这个问题的方向吗?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define maxn 300
int main(){
FILE *fin, *fout;
fin = fopen("splitwords.inp", "r");
fout = fopen("splitwords.txt", "w");
char buffer[maxn], word[maxn], ch, d;
int i, pos = 0;
while((ch = fgetc(fin)) != EOF && ch != '#'){
while(ch != ' ' && ch != '\t' && ch != '\0'){
word[pos] = ch;
pos++;
if((d = fgetc(fin)) == ' ' || d == '\t' || d == '\0'){
word[pos] = '\0';
fputs(word, fout);
printf("%s", word);
pos = 0;
}
}
if(ch == ' ' || ch == '\t' || ch == '\0') continue;
}
fclose(fin);
fclose(fout);
}
【问题讨论】:
-
使用
strtok,任务会简单很多 -
在您的 while 循环中,您使用
d存储读取的字符,但条件测试ch,它永远不会改变。 -
ch应该是int -
buffer 在您的程序中未使用,您不需要将读取的字符与空字符进行比较,它不存在于有效的文本文件中
-
为什么不使用
scanf()和"%s"格式?它会自动处理空间跳过。您所要做的就是寻找#。如果输入是abcd#efgh会发生什么——该哈希算作终止输入吗?