2

文字列または文字配列を関数に渡してスワップしていますが、何らかの理由で最初の文字配列の値が失われています。これが私のコードです:

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 では、関数に 2 つのポインターが渡され、それらがスワップされます。主な機能はこちら。変数の受け渡しに問題がある可能性がありますが、コンパイラでは問題が発生しませんでした。

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」を指し、プログラムを混乱させる連鎖反応のようなものである可能性があります。

また、これが起こっている理由も非常に役立つでしょう。

4

2 に答える 2

1

文字列が.So aよりも長いため、期待どおりに動作しません。bstrcpy

strcpy(b, temp);

チップ:

  • の代わりにstrncpyを使用します。strcpy
  • cスタイルの文字列の代わりにc ++文字列を使用ます。次に、それらを次のように交換できますa.swap(b);
于 2013-09-13T01:32:01.760 に答える
1

問題は、配列のサイズがたまたまスタックを破壊していることです。幸いなことに、その効果は単に a の最初の文字に null バイトを配置して、空の文字列にすることです。

#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

于 2013-09-13T06:23:17.623 に答える