строка — указатели C ++ strcpy, которые передаются в функцию

Я передаю строку или массив символов в функцию и меняю их местами, но по какой-то причине теряю значение первого массива символов. Вот мой код:

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, что означает или, по крайней мере, я думаю, что проблема заключается в указателях на исходные переменные. Это может быть тип цепной реакции, когда все указатели указывают на «а», и это сбивает с толку программу.

Буду признателен за любую помощь, а также, почему это происходит, было бы очень полезно.

2

Решение

Потому что ваша строка a длиннее чем b.Так strcpy не работает, как вы ожидаете в строке:

strcpy(b, temp);

Подсказки:

  • использование strncpy вместо strcpy
  • Использовать с ++ Струны вместо строки стиля с. Затем вы можете поменять местами
    их с a.swap(b);
1

Другие решения

Проблема в том, что размеры вашего массива таковы, что вы забиваете свой стек; к счастью, для вас эффект состоит в том, чтобы просто поместить нулевой байт в первый символ 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";
}

http://ideone.com/fDvnnH

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

1

По вопросам рекламы [email protected]