繁体   English   中英

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

[英]scanf doesn't input space as a character

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

恩。

输入:

12345 Maja Majovska:54

15145 Aco Acoski:95

14785马丁·马丁诺斯基(Martin Martinoski):87

://在标签下是空格

正确的输出:


玛雅·玛约夫斯卡(Maja Majovska)

阿科·阿科斯基

马丁·马蒂诺斯基


我的输出:

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

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

我认为这段代码应该工作。 同时输入两个字符#:(#是空格),然后按Enter

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM