get () и getchar () игнорируются - PullRequest
0 голосов
/ 06 апреля 2020

Я новичок здесь и с c кодированием, поэтому, пожалуйста, попробуйте со мной набраться терпения.

Моя проблема заключается в получении ввода символов как с помощью getchar (), так и scanf ("% c" ) для рекурсивного вызова.

Компилятор игнорирует getchar () и выводит \ n вместо вывода символа.

выданная строка: pfile-> content.folder.files [ i] = newFile (getchar ());

, запрещающий мне создавать вложенные файлы / папки ... Функция newFile должна создавать папку или файл (текстовый файл), и в случае, если это я должен указать количество файлов внутри папки, и есть рекурсивный вызов для создания файлов внутри уже созданной папки.

typedef struct {
    char *name;                 //name of File
    char type;                  // 'f' - data file, 'd'-folder.
    union {
        char data[81];             //f -80 chars array for content of file.
        struct {                //d -arry of pointers to 'File' Files.
            struct File ** files;
            unsigned int size;
        }folder;
    }content;
}File;

Функция:

FILE * newFile(char type){
    File *pfile = (File*)malloc(sizeof(File)); //creating new File
    if (type != 'f' && type != 'd') { // in case of wrong input of type.
        printf("Wrong input!\n");
        return NULL;
    }
    //File *pfile = (File*)malloc(sizeof(File)); //creating new File
    printf("Enter File name: ");
    scanf(" %s", &pfile->name);// Name of new File

    if (type == 'f') {      // New File is 'folder'
        printf("Enter number of files in folder '%s': ",&pfile->name);
        scanf(" %d", &pfile->content.folder.size);
        if (pfile->content.folder.size == 0) { // Zero files in the folder
            pfile->content.folder.files[pfile->content.folder.size - 1] = NULL; // No more files / empty folder
        }
        pfile->content.folder.files = (File**)malloc(pfile->content.folder.size * sizeof(File));

        for (int i = 0; i < pfile->content.folder.size; ++i) { // creates 'size' file per folder
            printf("Enter type of %d file(d-folder,f-file): ", i + 1);
            pfile->content.folder.files[i] = newFile(getchar());  //<<<<<=====ISSUE HERE !
        }
        return pfile;

    }
    else /*if (type == 'd')*/ { //File creation
        printf("Enter file's text:\n");
        scanf(" %s",&pfile->content.data);
    }
    return pfile;   
}

Я буду признателен за любую идею или предложения по улучшению.

Дан.

1 Ответ

2 голосов
/ 06 апреля 2020

Звонки на scanf оставляют новую строку во входном буфере. Другие вызовы scanf с использованием %d и %s пропускают пробелы при чтении. getchar однако читает следующий символ в буфере, который оказывается тем символом новой строки.

Вместо этого используйте scanf со строкой формата " %c". Спецификатор формата %c не пропускает пробел, но ведущий пробел делает.

char newtype;
scanf(" %c", &newtype);
pfile->content.folder.files[i] = newFile(newtype);
...