C цикл для чтения строк ввода - PullRequest
0 голосов
/ 05 октября 2018

Я хочу создать программу на C, которая принимает произвольное количество строк произвольной длины в качестве входных данных и затем печатает, чтобы утешить последнюю введенную строку.Например:

input:

hi
my name is
david

output: david

Я решил, что лучший способ сделать это - создать цикл, который принимает каждую строку каквведите и сохраните его в массиве char, так что в конце цикла последняя строка заканчивается тем, что хранится в массиве char, и мы можем просто напечатать это.

У меня была только одна лекция на Cдо сих пор, я думаю, что я просто продолжаю настраивать вещи неправильно с моим мышлением Java / C ++, так как у меня больше опыта в этих языках.

Вот то, что у меня есть, но я знаю, что это далеко не правильно:

#include <stdio.h>

int main()
{
    printf("Enter some lines of strings: \n");

    char line[50];

    for(int i = 0; i < 10; i++){
        line = getline(); //I know this is inproper syntax but I want to do something like this
    }

    printf("%s",line);


}

У меня также есть i < 10 в цикле, потому что я не знаю, как найти общее количество строк на входе, которое будет правильным количеством циклов для этого цикла.Кроме того, ввод вводится сразу из команды

./program < test.txt 

в оболочке Unix, где test.txt имеет ввод.

Ответы [ 3 ]

0 голосов
/ 06 октября 2018

Я предполагаю, что вы знаете максимальную длину строки ввода.

Этот здесь, безусловно, сделает работу за вас

static char *getLine( char * const b , size_t bsz ) {
            return fgets(b, bsz, stdin) );
}

Но помните fgets также помещает символ '\n' в конец буфера, так что, возможно, что-то вроде этого

static char *getLine( char * const b , size_t bsz ) {

            if( fgets(b, bsz, stdin) ){
                    /* Optional code to strip NextLine */
                    size_t size = strlen(b);
                    if( size > 0 && b[size-1] == '\n' ) {
                            b[--size] = '\0';
                    }
                    /* End of Optional Code */
                    return b;
            }
            return NULL;
    }

, и ваш код нужно немного изменить при вызове getline

#define BUF_SIZE 256
char line[BUF_SIZE];

for(int i = 0; i < 10; i++){
    if( getLine(line, BUF_SIZE ) ) {
            fprintf(stdout, "line : '%s'\n", line);
    }

}

Теперь вполне возможно создать такую ​​функцию, как

char *getLine();

, но тогда необходимо определить поведение этой функции, например, если функция getLine() выделяет память динамически, тогда вы, вероятно,необходимо использовать free для отмены выделения указателя, возвращаемого getLine()

, и в этом случае функция может выглядеть как

char *getLine( size_t bsz ) {
        char *b = malloc( bsz );
        if( b && fgets(b, bsz, stdin) ){
           return b;
        }
        return NULL;
}

в зависимости от того, насколько маленькой является ваша функция, которую вы можете развлекатьмысли о том, чтобы сделать это inline возможно, это немного не по теме.

0 голосов
/ 06 октября 2018

Чтобы иметь динамический номер входа динамической длины, вы должны продолжать перераспределять буфер, когда вход имеет большую длину.Чтобы сохранить последнюю строку, вам нужно взять другой указатель, чтобы отследить его и остановить ввод с терминала, вам нужно нажать клавишу EOF (ctrl + k).Это должно сделать вашу работу.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *get_last_line(FILE* fp, size_t size){
//The size is extended by the input with the value of the provisional
    char *str, *last_str = NULL;
    int ch;
    size_t len = 0, last_len = 0;
    str = realloc(NULL, sizeof(char)*size);//size is start size
    if(!str)return str;
    while(ch=fgetc(fp)){
        if(ch == EOF){
            break;
        }
        if(ch == '\n'){
            str[len]='\0';
            last_len = len;
            last_str = realloc(last_str,sizeof(char)*last_len);
            last_str[last_len]='\0';
            //storing the last line
            memcpy(last_str,str,sizeof(char)*last_len);
            str = realloc(NULL, sizeof(char)*size);//size is start size
            len = 0;
        }
        else {
            str[len++]=ch;
            if(len==size){
                str = realloc(str, sizeof(char)*(size+=16));
                if(!str)return str;
            }
        }
    }
    free(str);
    return last_str;
}

int main(void){
    char *m;

    printf("input strings : ");
    m = get_last_line(stdin, 10);
    printf("last string :");
    printf("%s\n", m);
    free(m);
    return 0;
}
0 голосов
/ 05 октября 2018

Использование fgets():

while (fgets(line, sizeof line, stdin)) {
    // don't need to do anything here
}
printf("%s", line);

Вам не нужно ограничивать количество итераций.В конце файла fgets() возвращает NULL и не изменяет буфер, поэтому line будет по-прежнему содержать последнюю прочитанную строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...