c - scanf 不输入空格作为字符

标签 c file while-loop

下面的程序应该打印出文件中两个输入字符之间的一行的所有字符。它适用于所有测试用例,除了显式输入的字符之一是空格的测试用例。

例如。

输入:

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/

相关文章:

C/Linux : setgid leaves root in list of groups

c - 创建动态数量的线程时出错

c - 值正在使用但未初始化

Android - 加载文件夹中的所有文件

java - while 循环中的多个条件的条件顺序是否重要?

c - 功能不起作用,GDB 也没有发现错误

java - 在Java中的 `break`循环中使用 `while`语句有什么问题?

C 结构体作为参数

android - 如何在仅知道其媒体内容 Uri 的 Android 中重命名文件

file - 在 Swift 中,如何将现有二进制文件读入数组?