Я делал относительно простую проблему с строкой в онлайн-судье 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++?
Если у вас есть возможность использовать 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.
std::string
?