下面的程序应该打印出文件中两个输入字符之间的一行的所有字符。它适用于所有测试用例,除了显式输入的字符之一是空格的测试用例。
例如。
输入:
12345 玛雅·马约夫斯卡:54
15145 阿科·阿科斯基:95
14785 马丁·马蒂诺斯基:87
#
://主题标签下方是空格
正确输出:
<小时/>玛雅·马约夫斯卡
阿科·阿科斯基
马丁·马蒂诺斯基
<小时/>我的输出:
54
15145 阿科阿科斯基 95
14785 马丁·马蒂诺斯基 87
#include<stdio.h>
#include<string.h>
void wtf() {
FILE *f = fopen("podatoci.txt", "w");
char c;
while((c = getchar()) != '#') {
fputc(c, f);
}
fclose(f);
}
int main()
{
wtf();
getchar();
char z1, z2, c;
FILE *f;
f=fopen("podatoci.txt", "r");
int flag=0;
scanf(" %c %c", &z1, &z2);
while((c=fgetc(f))!=EOF){
if(c==z1){
flag=1;
continue;
}
if(c==z2){
flag=0;
printf("\n");
}
if(flag)
printf("%c", c);
}
fclose(f);
return 0;
}
有人可以简单地指出我做错了什么吗?我是处理文件的新手。
最佳答案
我认为这段代码应该可以工作。同时输入两个字符#:(#为空格)后输入
#include<stdio.h>
#include<string.h>
void wtf() {
FILE *f = fopen("podatoci.txt", "w");
char c;
while((c = getchar()) != '#') {
fputc(c, f);
}
fclose(f);
}
int main()
{
// wtf();
// getchar();
char z1, z2, c;
FILE *f;
f=fopen("podatoci.txt", "r");
int flag=0;
printf("enter chars : ");
// scanf(" %c %c", &z1, &z2);
// printf("chars are |%c| |%c|",z1,z2);
char name[3];
fgets(name, 3, stdin);
// printf("chars are |%c| |%c|",name[0],name[1]);
char buffer[512]; // I suppose 512 is enough (see Two problems below)
int i=0;
while((c=fgetc(f))!=EOF){
/* Different problems :
1 : you have a 'space' followed by 'end of line' before ':'
example you have a space before 54 but end of line before :
So you could not display characters when a 'space' is a found.
You have to use a temporary buffer
2 : you have to reset your flag at the end of line
3 : If you have ':' alone, do not printf("\n")
4 : If you have a 'space' after the first 'space', it must be printed
example : Maja Majovska
^ (this space)
*/
if(c=='\n') { // Address pb 2
flag=0;
i=0;
continue;
}
if(!flag&&c==name[0]){ // Address pb 4
flag=1;
continue;
}
if(flag&&c==name[1]){ // Address pb 3
flag=0;
buffer[i]='\0'; // end of string
printf("%s\n",buffer);
i=0;
}
if(flag)
buffer[i++]=c; // Address pb 1
}
fclose(f);
return 0;
}
一些评论:
大部分解释都在代码注释中(阅读后可以删除)
我使用 fgets 而不是 scanf ( https://stackoverflow.com/a/1248017/7462275 )
我这样做是为了使代码尽可能接近其原始形式。但是,我认为最好逐行获取文本并使用字符串函数(string.h)。例如,打印两个字符之间的第一个子字符串(不进行完整性检查:这两个字符必须在字符串中)
while((fgets(buffer,512,f))!=NULL){
i=strchr(buffer,name[0]);
*(strchr(i,name[1]))='\0';
printf("%s\n",i);
}
关于c - scanf 不输入空格作为字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54168184/