scanf не вводит пробел как символ - PullRequest
0 голосов
/ 13 января 2019

Предполагается, что приведенная ниже программа распечатает все символы строки из файла между двумя введенными символами. Он отлично работает для всех тестовых случаев, кроме одного, в котором один из явно введенных символов является пробелом.

ех.

Введите:

12345 Майя Майовска: 54

15145 Aco Acoski: 95

14785 Мартин Мартиноски: 87

#

: // Под хэштегом находится пробел

Правильный вывод:


Майя Майовска

Aco Acoski

Мартин Мартиноски


Мой вывод:

* * 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 голосов
/ 13 января 2019

Я думаю, что этот код должен работать. Введите два символа одновременно #: (# - пробел), затем введите

#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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...