ある特定の位置で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);
}
No.5
- 回答日時:
不具合の直接の原因は既に回答が出ているとおりです。
しかし、根本的な解決方法は別にあるかと思います。それは、非標準関数の strdup を使うことではなく、標準関数テンプレートの std::reverse および std::reverse_copy を使うことです。
これにより、rev_str 関数は二つとも不要になります。
回答ありがとうございます。
今回は関数のオーバーロードの演習でこのようなコードを書きました。
標準関数テンプレートに関しては、勉強不足でして、恥ずかしながらいまだに名前しか知らない状態です。
今後学習する予定もありますし、使える物は使っていこうと思います。
No.3ベストアンサー
- 回答日時:
> 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 ) );
といった具合に変更してみましょう
回答ありがとうございます。
問題の関数ばかりに気をとられていて気づきませんでした。今後は気をつけていこうと思います。
詳細な回答ありがとうございました。
No.2
- 回答日時:
素直に strdup 使っていればこういう目にあわずにすんだのに
//char *a = (char*)malloc(sizeof(source));
//strcpy(a, source);
char *a = strdup(source);
rev_str(a);
strcpy(des, a);
free(a);
}
デバッガで追いかけて、malloc で何バイト確保しようとしているか
よーく見てみてください。
回答ありがとうございます。
無事問題を解決することが出来ました。
便利な関数が多々あるようなので、できるだけ使えるように頑張ろうかと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
fgetsなどのときのstdinのバッ...
-
間接操作のレベルとは
-
CStringをwchar_tに変換したい
-
バイトスワップをやりたい
-
c言語でユーザ関数を利用して入...
-
C言語の入力した文字を反転させ...
-
atoi( ) の反対をやりたい
-
文字列から空白を取り除きたい...
-
Linuxでフォルダ内全ファイル名...
-
enumの記述について。
-
配列をnビットシフトする
-
ユニコード文字列の分割
-
DPマッチング
-
C言語です
-
RGB→YUV変換のプログラム
-
C言語のビットフィールドについて
-
c++ 文字列を入力して、一文字...
-
C言語のポインターで詰まっている
-
ワイルドカードを用いた文字列検索
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報