2016-01-28 2 views
0

Мне нужно написать программу, которая предложит пользователю ввести строку, затем определить середину строки и сгенерировать новую строку, которая свопирует две половины строки и затем выводит результаты.Как разбить массив с помощью строк?

До сих пор я

int main(void) { 

char *string = NULL; 
char temp[1000]; 
cout << "Please enter a string" << endl; 
cin.getline(temp, 999); 
int length = strlen(temp); 
string = new char[length]; 
strcpy(string,temp); 
length = length/2; 

    return EXIT_SUCCESS; 
} 

Который берет в строку и сохраняет ее. Мне просто нужен способ переместить эту вторую половину в новый массив, и я знаю, что мне нужно использовать strcpy(), но я не знаю, как правильно ссылаться на эту часть массива.

+0

Посмотрите на [strncpy] (http://en.cppreference.com/w/cpp/string/byte/strncpy). Тем не менее, вы должны попытаться использовать 'std :: string' вместо этого и стандартные алгоритмы. – vsoftco

+0

Есть ли способ заставить strncpy начать принимать массив после n? или он будет делать только до n? – Tremors

+0

Прежде чем вы начнете выяснять алгоритм, вы можете исправить очевидную ошибку в показанном коде, которая приведет к неопределенному поведению, повреждению памяти и случайным сбоям (подсказка: strlen() не считает конечный «\ 0» что strcpy() добавляет). –

ответ

0

Если вы пытаетесь использовать C, используйте strncpy. Однако я рекомендую использовать C++ std::string и использовать std::string.substr() и конкатенацию. Мне было бы легче, по крайней мере, мне.

0

Вы были на половине пути решения. Здесь я закончил его с помощью strncpy, чтобы получить первую половину и инкремент указателя, чтобы получить вторую.

#include <iostream> 
#include <cstring> 
#include <cstdlib> 

using namespace std; 

int main(void) 
{ 
    char temp[1000]; 
    cout << "Please enter a string" << endl; 
    cin.getline(temp, 999); 
    int length = strlen(temp); 

    char firstHalf[512]; 
    strncpy (firstHalf, temp, length/2); 
    cout << "firstHalf: " << firstHalf << endl; 

    char* secondHalf = temp + length/2; 
    cout << "secondHalf: " << secondHalf << endl; 

    char* swapped_str = strcat(secondHalf, firstHalf); 
    cout << "Swapped string: " << swapped_str << endl; 

    return EXIT_SUCCESS; 
} 
+0

Это скорее ответ стиля c (с использованием ), чем один cpp. Я согласен с @ jalomas7 и лично воспользуюсь , чтобы решить эту проблему. –

0
std::string text(whatever...); 
int sz = text.size()/2; 
for (int i = 0; i < sz; ++i) 
    std::swap(text[i], text[sz + i]); 

Это может быть смещена на один, когда text.size() нечетное.

1

Поскольку это C++, я собираюсь предложить стандартный библиотечный алгоритм. Вы просите обменивать две половины последовательности, и std::rotate делает именно это. К сожалению, он вращается на месте, и вы хотите получить результат в другой строке.

Вы можете скопировать строку, а затем выполнить вращение, но есть алгоритм std::rotate_copy, который будет выполнять (и быстрее, чем отдельные шаги копирования/поворота).

Пример с char массивами:

#include <algorithm> 
#include <cstring> 
#include <iostream> 

int main() 
{ 
    char text[1000], result[1000]; 
    std::cout << "Please enter a string\n"; 
    std::cin.getline(text, 999); 
    size_t length = strlen(text); 

    std::rotate_copy(text, text + length/2, text + length, result); 
    result[length] = '\0'; 

    std::cout << text << '\n' << result << '\n'; 
} 

Пример с std::string:

#include <algorithm> 
#include <iostream> 
#include <string> 

int main() 
{ 
    std::string text, result; 
    std::cout << "Please enter a string\n"; 
    std::getline(std::cin, text); 
    size_t length = text.size(); 

    result.resize(length); 
    std::rotate_copy(text.begin(), text.begin() + length/2, text.end(), result.begin()); 

    std::cout << text << '\n' << result << '\n'; 
} 

Вы могли бы, возможно, использовать std::swap_ranges но это предполагает, оба диапазона имеют одинаковый размер.

Смежные вопросы