Я передаю строку или массив символов в функцию и меняю их местами, но по какой-то причине теряю значение первого массива символов. Вот мой код:
void foo(char* a, char* b){
char* temp;
temp = new char[strlen(a)+1];
strcpy(temp, a);
strcpy(a, b);
strcpy(b, temp);
delete[] temp;
}
Таким образом, в foo функция получает два указателя, и они пытаются поменяться местами.
Вот основная функция. Может быть проблема с передачей переменной, но компилятор не дал мне проблемы.
int main(){
char a[] = "First";
char b[] = "Last";
std::cout << "A Before: "<< a << "\n";
std::cout << "B Before: " << b << "\n\n";
foo(a, b);
std::cout << "A After: "<< a << "\n";
std::cout << "B After: "<< b << "\n\n";
return 0;
}
Вывод, который я получаю, выглядит следующим образом:
A Before: first
B Before: last
A After:
B After: first
Теперь я проверил значения строк во время выполнения функции strcpy и стал пустым после последнего strcpy, что означает или, по крайней мере, я думаю, что проблема заключается в указателях на исходные переменные. Это может быть тип цепной реакции, когда все указатели указывают на «а», и это сбивает с толку программу.
Буду признателен за любую помощь, а также, почему это происходит, было бы очень полезно.
Потому что ваша строка a
длиннее чем b
.Так strcpy
не работает, как вы ожидаете в строке:
strcpy(b, temp);
Подсказки:
Проблема в том, что размеры вашего массива таковы, что вы забиваете свой стек; к счастью, для вас эффект состоит в том, чтобы просто поместить нулевой байт в первый символ a, сделав его пустой строкой.
#include <iostream>
#include <string.h>
void foo(char* a, char* b){
char* temp = new char[strlen(a)+1];
strcpy(temp, a);
std::cout << "temp = " << temp << " a = " << a << " b = " << b << std::endl;
strcpy(a, b);
std::cout << "temp = " << temp << " a = " << a << " b = " << b << std::endl;
strcpy(b, temp); // this copies 6 bytes to b, which puts a 0 in the first byte of a.
std::cout << "temp = " << temp << " a = " << a << " b = " << b << std::endl;
delete[] temp;
}
int main() {
char a[] = "First";
char b[] = "Last";
std::cout << "a size is " << sizeof(a) << std::endl;
std::cout << "b size is " << sizeof(b) << std::endl;
std::cout << "address of a[0] is " << (void*)&a[0] << std::endl;
std::cout << "address of b[0] is " << (void*)&b[0] << std::endl;
foo(a, b);
std::cout << "A After: "<< a << "\n";
std::cout << "B After: "<< b << "\n\n";
}
a size is 6
b size is 5
address of a[0] is 0xbfec5caa
address of b[0] is 0xbfec5ca5
temp = First a = First b = Last
temp = First a = Last b = Last
temp = First a = b = First
A After:
B After: First
Вы могли бы хотеть исследовать std::string
или посмотрите на использование std::strncpy