Динамически размещаемые строки в C

0

Я делал относительно простую проблему с строкой в онлайн-судье UVa, чтобы попрактиковаться со строками, так как мне было трудно с ними работать в C. Проблема в основном просит проверить, содержит ли строка B другую строку A, если вы удалите "беспорядок" 'и объединить остальные символы, например, если "ABC" содержится в "AjdhfmajBsjhfhC" которая в этом случае истинна.

Итак, мой вопрос в том, как я могу эффективно распределять память для строки, которой я не знаю ее длины? То, что я сделал, это сделать строку по-настоящему большой char Mstring[100000], прочитать с ввода, а затем использовать strlen(Mstring) чтобы скопировать строку массивом символов с соответствующим размером. Что-то вроде:

char Mstring[100000];

scanf("%s",Mstring);
int length = strlen(Mstring);
char input[length+1]={0};
for(int i = 0; i<length;i++){
    input[i]=Mstring[i];
}

Есть ли лучший/стандартный способ сделать это в C? Я знаю, что C не имеет большой поддержки для строк, если нет лучшего способа сделать это на C, возможно, в C++?

  • 0
    я должен добавить тег C ++?
  • 2
    Только если вы работаете в C ++ и будете принимать ответы, которые работают только в C ++.
Показать ещё 15 комментариев
Теги:
string

1 ответ

1
Лучший ответ

Если у вас есть возможность использовать C++ (как вы упомянули), это сделает вашу жизнь намного проще. Затем вы можете использовать строку STL (std :: string), которая управляет строками динамического размера для вас. Вы также можете удалить старого сканера scanf() и использовать std :: cin.

Пример:

#include <iostream>
#include <string>

void main()
{
    std::string sInput;
    std::getline(std::cin, sInput);

    // alternatively, you could execute this line instead:
    // std::cin >> sInput;
    // but that will tokenize input based on whitespace, so you
    // will only get one word at a time rather than an entire line
}

Описывая, как управлять строками, которые могут динамически расти на C, потребуется значительно больше объяснений и забот, и похоже, что вам это действительно не нужно. Однако, если это так, вот стартовая точка: http://www.strchr.com/dynamic_arrays.

  • 0
    Спасибо! Да, в C ++ все нормально, но было бы неплохо узнать, как это сделать в C, я проверю ссылку. Проверка того, должен ли массив быть больше, не снизит производительность? Вы знаете, как это делает std::string ?
  • 1
    Короче говоря, класс наподобие std :: string выделит массив некоторого размера по умолчанию X, используя malloc (X) в конструкторе. Когда ему нужно расширить для хранения большего количества контента, он использует realloc (Y), чтобы увеличить размер выделенного пространства и сохранить исходный контент. Он также может уменьшить свое пространство, используя realloc (Z), если сочтет это необходимым.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню