2015-02-12 2 views
-2

Я пытаюсь найти способ манипулировать строками в C более эффективным способом (возможно, как это делает Java). Один из способов, которым я думал, состоит в том, чтобы подсчитать размер строки до конца строки (возможно, включая пробелы), выделить память этого размера с помощью malloc(), а затем вернуться к началу строки и просмотреть строку. Есть ли способ сделать это? Я не знаю, есть ли способ вернуть «курсор» к началу строки, чтобы «пересканировать что-то». И если вы знаете другой/лучший способ справиться со строками в C, скажите, пожалуйста. БлагодаряC: подсчет длины строки перед использованием scanf

+0

Вы не можете «вернуться» в не доступном для поиска потока (например, терминал или гнездо). –

+0

Возможный дубликат [Как я могу прочитать строку ввода неизвестной длины?] (Http://stackoverflow.com/questions/16870485/how-can-i-read-a-an-input-string-of-unknown -length) – QuestionC

+0

Вы можете пометить текущий указатель файла 'ftell()', а затем перемотать с помощью 'fseek()' для повторной обработки, установив длину строки + 2, а затем использовать 'fgets() '. Хотя, вероятно, более эффективно выделять щедрый буфер в первую очередь и перераспределять его, если строка текста ввода была усечена, а затем скомпонована. –

ответ

0

Там нет никакого способа, чтобы сделать то, что вы просите непосредственно, но есть (на мой взгляд, гораздо лучше) альтернатива: fgets().

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

Что-то вроде этого (UNTESTED КОД):

// WARNING: Example does not include error checking 
// (check the return value of `fgets()`, `malloc()` and `realloc()`!) 

size_t buflen = 64; 
size_t pos = 0; 
char* buf = malloc(buflen); 

// `for(;;)` is an infinite loop 
for(;;) 
{ 
    // read data into buf[pos..buflen] (total of `buflen-pos` bytes) 
    fgets(buf + pos, buflen - pos, file); 
    pos = pos + strcspn(buf + pos, "\r\n"); 
    if(buf[pos]) // reached end of line; end the loop 
     break; 

    buflen += 64; 
    // alternative (double the size): 
    // buflen <<= 1; 
    buf = realloc(buf, buflen); // resize the buffer 
} 
// `buf` contains our line; `pos` contains the end of it 
// optional: remove the trailing newline 
// buf[pos] = 0; 

Соответствующая документация:

0

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

Размер вашего начального буфера может быть 16. И после того, как вы прочитаете каждый символ, вы проверите, есть ли у вас место для этого нового символа. Если у вас нет места для вашего нового персонажа, вы удваиваете размер буфера и realloc.

Заканчивать пример кода:

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

char *str; 

int main(void) { 
    char c = '\0'; 
    int size = 0; 
    int buffer_size = 16; 

    str = (char *) calloc(buffer_size, sizeof(char)); 

    while (c != '\n') { 
    scanf("%c", &c); 
    if (size + 1 == buffer_size) { 
     buffer_size *= 2; 
     str = (char *) realloc(str, buffer_size); 
     if (str == NULL) { 
     fprintf(stderr, "insufficient memory\n"); 
     return EXIT_FAILURE; 
     } 
    } 
    str[size] = c; 
    size++; 
    } 

    printf("%s\n", str); 

    return EXIT_SUCCESS; 
} 
Смежные вопросы