scanf不会将空格作为字符输入

时间:2019-01-13 10:59:25

标签: c file while-loop

下面的程序应该从两个输入字符之间的文件中打印出一行的所有字符。它适用于所有测试用例,但其中一个明确输入的字符是空格的情况除外。

例如。

输入:

12345 Maja Majovska:54

15145阿科·阿科斯基:95

14785马丁·马蒂诺斯基:87

://在主题标签下是空格

正确的输出:


Maja Majovska

Aco Acoski

Martin Martinoski


我的输出:

54

15145 Aco Acoski 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;
}

有人可以简单地指出我在做什么错吗?我是刚接触文件的人。

1 个答案:

答案 0 :(得分:1)

我认为此代码应该有效。同时输入两个字符#:(#是空格),然后输入

#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);
}