Я пытаюсь найти способ манипулировать строками в C более эффективным способом (возможно, как это делает Java). Один из способов, которым я думал, состоит в том, чтобы подсчитать размер строки до конца строки (возможно, включая пробелы), выделить память этого размера с помощью malloc()
, а затем вернуться к началу строки и просмотреть строку. Есть ли способ сделать это? Я не знаю, есть ли способ вернуть «курсор» к началу строки, чтобы «пересканировать что-то». И если вы знаете другой/лучший способ справиться со строками в C, скажите, пожалуйста. БлагодаряC: подсчет длины строки перед использованием scanf
ответ
Там нет никакого способа, чтобы сделать то, что вы просите непосредственно, но есть (на мой взгляд, гораздо лучше) альтернатива: 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;
Соответствующая документация:
Вы можете использовать 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;
}
- 1. C - Scanf выполнить перед печатью
- 2. Smarty, подсчет длины строки массива?
- 3. Подсчет длины тамильской строки php
- 4. Подсчет числа слов n-длины из строки в C
- 5. C Программирование: подсчет длины слов в строке
- 6. C: scanf и строки
- 7. Подсчет аргументов, переданных scanf() в C
- 8. Подсчет длины строки, когда проходит только объект?
- 9. Подсчет Unicode длины строки без сочетающих знаков
- 10. Подсчет длины каждого слова в c char
- 11. Длины строки Objective C
- 12. C - ограничение длины строки
- 13. Подсчет длины чисел
- 14. C: Использование scanf для принятия предопределенной входной длины char []
- 15. Конец строки Подсчет слов (C++)
- 16. анализ с использованием scanf в C
- 17. scanf сбой программы и сравнение строки C
- 18. scanf/длина поля: с использованием переменной/макроса, C/C++
- 19. подсчет длины между чередующимися столбцами
- 20. подсчет числа цифр при использовании только scanf в c
- 21. Подсчет строк перед событием - data.table
- 22. Оценка длины строки в C
- 23. Форматирование строки неизвестной длины C++
- 24. подсчет длины слова в файле
- 25. Подсчет длины JSON в Android
- 26. подсчет длины слов в .txt
- 27. scanf для строки и числа в C
- 28. Чтение строки в C++ с помощью scanf
- 29. Цель C: Как исправить scanf() пропуская строки
- 30. Scanf неизвестное число аргументов строки C
Вы не можете «вернуться» в не доступном для поиска потока (например, терминал или гнездо). –
Возможный дубликат [Как я могу прочитать строку ввода неизвестной длины?] (Http://stackoverflow.com/questions/16870485/how-can-i-read-a-an-input-string-of-unknown -length) – QuestionC
Вы можете пометить текущий указатель файла 'ftell()', а затем перемотать с помощью 'fseek()' для повторной обработки, установив длину строки + 2, а затем использовать 'fgets() '. Хотя, вероятно, более эффективно выделять щедрый буфер в первую очередь и перераспределять его, если строка текста ввода была усечена, а затем скомпонована. –