Вы не выделяли память, куда вы собираетесь временно копировать строки. Указатель temp
не инициализирован.
char *temp;
Таким образом, функция вызывает неопределенное поведение.
Функция может быть написана проще, если использовать стандартные строковые функции Си.
Например,
#include <iostream>
#include <cstring>
#include <algorithm>
void swap1( char *a, char *b )
{
size_t n = std::max( strlen( a ), strlen( b ) ) + 1;
char *temp = new char[n];
std::strcpy( temp, a );
std::strcpy( a, b );
std::strcpy( b, temp );
delete [] temp;
}
int main()
{
char s[2][27] = {"wangzhehan", "cuisibo"};
std::cout << s[0] << '\n';
swap1( s[0], s[1] );
std::cout << s[0] << '\n';
return 0;
}
Выходные данные программы:
wangzhehan
cuisibo
Если вы не можете использовать стандартные строковые функции и должны использовать только циклы, то функция может выглядеть следующим образом, как показано в демонстрационной программе ниже.
#include <iostream>
void swap1( char *a, char *b )
{
size_t n1 = 0;
while( a[n1] != '\0' ) ++n1;
size_t n2 = 0;
while ( b[n2] != '\0' ) ++n2;
size_t n = n1 < n2 ? n2 : n1;
char *temp = new char[n + 1];
for ( size_t i = 0; ( temp[i] = a[i] ) != '\0'; ++i );
for ( size_t i = 0; ( a[i] = b[i] ) != '\0'; ++i );
for ( size_t i = 0; ( b[i] = temp[i] ) != '\0'; ++i );
delete [] temp;
}
int main()
{
char s[2][27] = {"wangzhehan", "cuisibo"};
std::cout << s[0] << '\n';
swap1( s[0], s[1] );
std::cout << s[0] << '\n';
return 0;
}
Опять же, вывод функции -
wangzhehan
cuisibo
И, наконец, самый простой способ - объявить функцию как функцию шаблона. В этом случае вам не нужно выделять память динамически.
Например
#include <iostream>
template <size_t N>
void swap1( char ( &a )[N], char ( &b )[N] )
{
char temp[N];
for ( size_t i = 0; ( temp[i] = a[i] ) != '\0'; ++i );
for ( size_t i = 0; ( a[i] = b[i] ) != '\0'; ++i );
for ( size_t i = 0; ( b[i] = temp[i] ) != '\0'; ++i );
}
int main()
{
char s[2][27] = {"wangzhehan", "cuisibo"};
std::cout << s[0] << '\n';
swap1( s[0], s[1] );
std::cout << s[0] << '\n';
return 0;
}