プロが教える店舗&オフィスのセキュリティ対策術

ある特定の位置でcout を用いて数字を表示しようとするとエラーが発生してしまいます。

具体的には以下の関数内でのことなのですが、原因の分かる方がいましたら解答お願いします。

受け取った文字列を逆順にする関数です。



----------------------------------------------------------

void rev_str(char *a)
{
int length = 0;


cout << length; // ここでエラーが発生


while(true) {
if(*(a + length) == '\0') break;
length++;
}
for(int i = 0; i < length / 2; i++) {
char temp = a[i];
a[i] = a[length - i - 1];
a[length - i - 1] = temp;
}
}



---------------------------------------------------------


エラーの発生する部分ですが、数字ではなく文字・文字列なら問題なく表示されます。

このコードでは変数 length を表示しようとしていますが、length でなくても、またどのような『数』でも『この関数内』で cout を使用するとエラーが発生します。

この関数に何か間違いがあるのではないかと思うのですが、どうにも見つけることが出来ません。
コード全体はこの下に掲載します。

cout に何か制約があるのでしょうか。それとも、やはりコードのどこかに誤りがあるのでしょうか。わかる方がいましたら、解答お願いします。




全コード
------------------------------------------------------
#include <iostream>
#include <cstring>
using namespace std;

void rev_str(char *a);
void rev_str(const char *source, char *des);

int main()
{
char a[80], b[80];
strcpy(a, "hello, world!");
rev_str(a, b);
rev_str(a);
cout << a << "\n";
cout << b << "\n";

return 0;
}

void rev_str(char *a)
{
int length = 0;

cout << length;

while(true) {
if(*(a + length) == '\0') break;
length++;
}
for(int i = 0; i < length / 2; i++) {
char temp = a[i];
a[i] = a[length - i - 1];
a[length - i - 1] = temp;
}
}

void rev_str(const char *source, char *des)
{
char *a = (char*)malloc(sizeof(source));
strcpy(a, source);
rev_str(a);
strcpy(des, a);
free(a);
}

A 回答 (5件)

不具合の直接の原因は既に回答が出ているとおりです。



しかし、根本的な解決方法は別にあるかと思います。それは、非標準関数の strdup を使うことではなく、標準関数テンプレートの std::reverse および std::reverse_copy を使うことです。
これにより、rev_str 関数は二つとも不要になります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

今回は関数のオーバーロードの演習でこのようなコードを書きました。

標準関数テンプレートに関しては、勉強不足でして、恥ずかしながらいまだに名前しか知らない状態です。
今後学習する予定もありますし、使える物は使っていこうと思います。

お礼日時:2007/08/13 13:24

志村、+1、+1>#3

    • good
    • 0

> void rev_str(const char *source, char *des)


> {
>  char *a = (char*)malloc(sizeof(source));
>  strcpy(a, source);
>  rev_str(a);
>  strcpy(des, a);
>  free(a);
> }
の中でmallocで確保されるサイズは sizeof(source)なので
char型のポインタサイズ ... 32Bit環境なら4バイトってことになります
その領域に対して strcpyを実行するので4バイト以上の文字列をコピーすればメモリー領域が破壊されます

NULL終端の文字列が対象なら
char *a = (char*)malloc( strlen( source ) );
といった具合に変更してみましょう
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

問題の関数ばかりに気をとられていて気づきませんでした。今後は気をつけていこうと思います。

詳細な回答ありがとうございました。

お礼日時:2007/08/13 13:29

素直に strdup 使っていればこういう目にあわずにすんだのに



//char *a = (char*)malloc(sizeof(source));
//strcpy(a, source);
char *a = strdup(source);
rev_str(a);
strcpy(des, a);
free(a);
}

デバッガで追いかけて、malloc で何バイト確保しようとしているか
よーく見てみてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

無事問題を解決することが出来ました。
便利な関数が多々あるようなので、できるだけ使えるように頑張ろうかと思います。

お礼日時:2007/08/13 13:31

coutではなく、それより後のメモリ操作に問題があるのではないですか?


ついでですから、coutの後のあちこちにcoutを書いて変数の値を出力してみたらいいと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

そうですね。問題はメモリ操作にあったようです。
どこに間違いがあるのかわからないのが怖いですね。今後は気をつけたいです。

お礼日時:2007/08/13 13:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!