![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
文字数が一定でない文字列の一覧を、配列に格納したいと思っています。
"AAA"
"BBBBB"
"CC"
このような文字列を配列に格納するのに普通にやるなら
char test[3][24];
for(i=0;i<3;i++){
strcpy(test[i],file[i]);
}
(便宜上、file[0]には、"AAA",file[1]には"BBBBB"が格納されてるとします)
こうやると、test[3][24]の24バイトとか余計に確保した分が無駄になるので、
必要な文字列の長さだけ配列を確保したいと考えています。
で、
char *test[3];
for(i=0;i<3;i++){
//sizeには、各文字列のサイズが格納してあります。ここではその部分省略しますが
test[i]= (char*)malloc(size);
strcpy(test[i],file[i]);
}
とやれば
(イメージで)
test[0]= "AAA"
test[1]= "BBBBB"
test[2]= "CC"
となると思ったのですが、うまく処理されませんでした。
このような処理をさせたい場合根本的に違うのでしょうか。
わかりにくい説明ですが、どなたかご存知の方よろしくお願いします
No.9ベストアンサー
- 回答日時:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
const char *file[] = { "AAA", "BBBBB", "CC" };
char *test[3] = {0};
size_t i, length;
for(i = 0; i < 3; ++i){
length = 1 + strlen(file[i]);
test[i] = malloc(1 + length);
if( test[i] == NULL){
break;
}else{
strcpy(test[i], file[i]);
}
}
for(i = 0; i < 3; ++i){
printf("<%d>: test=[%s]\tfile=[%s]\n", i, test[i], file[i]);
if( test[i] ){
free( test[i] );
test[i] = NULL;
}
}
}
-----実行結果-----
<0>: test=[AAA] file=[AAA]
<1>: test=[BBBBB] file=[BBBBB]
<2>: test=[CC] file=[CC]
-----
正しく処理されましたが…。
Windows2000sp4/VC++6.0sp6/ConsoleApp
※投稿するとインデントがつぶされるので2バイトスペースでインデントしています。
ご返答ありがとうございます。
実際に動くコードを教えていただきとても参考になりました。
このコードを元に再確認して相違点を直した所不具合が直りました。
おっしゃる通り、プログラムの流れ自体は問題ありませんでした。
(事情がありましたが、質問内容と実際のコードの違いにより
不具合点がありました)
どうもありがとうございました。
No.7
- 回答日時:
まず問題を特定した方がよいかもしれません。
どのようなデータの時にどういう問題が発生するのか
調べるのが先かと思います。
例えば
・コピー元のデータが1バイトデータ(全角日本語でない場合)で同様に問題が発生しますか?
・malloc時のサイズは適切ですか?
・サイズ分のコピーはされましたか?
また
> 今はi=1の時のstrcpy時にtest[0]="AAB"になってしまっている事です。
本当でしょうか?
test[0]="AABBBBB"ではないですか?
質問内容のコードが実際のコードと合っていますか?
(これが違うといつになっても適切な回答は得られないと思います)
ご返答ありがとうございます。
皆さんから頂いた内容を元にコードを再確認して
不具合が直りました。
おっしゃる通り、プログラムの流れ自体は問題ありませんでした。
(事情がありましたが、質問内容と実際のコードの違いにより
不具合点がありました)
どうもありがとうございました。
No.6
- 回答日時:
> i=1処理時にi=20000とかになってしまいデータが壊れてしまったような感じです。
iのデータが壊れたタイミングの実行コードを
教えていただければ分かるかもしれません。
この回答への補足
すみません。i=1の時のstrcpy時におかしくなる、
と書きましたが、
よく調べた所、malloc時にすでにtest[0]="AA○"
となって、一番後ろの文字が消えてしまっていました。
どうぞよろしくです。
ご回答ありがとうございます。
#2の方へ回答しましたが、
i=20000の部分はまったく別の所の自分のミスでした。
これは今は問題ありません。
今はi=1の時のstrcpy時にtest[0]="AAB"になってしまっている事です。
何か思い当たる部分等ございますでしょうか?
No.4
- 回答日時:
問題なさそうですが、mallocの返値はNULLではない(正常に領域各できている)のですよね?
可能性としては、sizeが間違っているか??
何回かバグ付きのmallocを実行させてメモリがぐちゃぐちゃになっていたとか・・・(OS再起動)
ちなみに、mallocが確保するメモリサイズは処理系依存ですので、malloc(3)とやっても3以上が確保されるのは保証されますが、管理用領域とかキリのいい数字でもっとたくさんメモリ消費される可能性はあります。。。。
ご返答ありがとうございます。
皆さんから頂いた内容を元にコードを再確認して
不具合が直りました。
おっしゃる通り、プログラムの流れ自体は問題ありませんでした。
(事情がありましたが、質問内容と実際のコードの違いにより
不具合点がありました)
どうもありがとうございました。
No.2
- 回答日時:
No.1の方と同じく、問題ないと思います。
別の場所に問題があるのでは?
この回答への補足
ご返答ありがとうございます。
#1の方に回答した後、自分でもやりなおしていると
一箇所自分のミスがありまして
それがi=20000の原因になっていました。
ただ、その部分を直した所、まだ処理自体はうまく動作していません。
うまくいかないのは、処理をすると
i= 0の時 test[0]="AAA"になるのですが、
i= 1の時 test[0]="AAB"となり
test[1]="BBBB"となってしまって、
1文字変な所で削れてしまっているようです。
なにか思い当たる部分等ございますでしょうか?
No.1
- 回答日時:
一見問題なさそうに見えますが
どのようにうまくいかなかったのでしょうか?
補足説明をお願いします。
ところでサイズにヌル分は含んでいますか?
この回答への補足
ご返答ありがとうございます。
サイズにNULLは含んでおります。
"AAA"であればサイズは3ですので
(char *)MALLOC(3+1)
としております。この認識でよろしかったでしょうか?
うまくいかないのは、for文内のi=1の時にメモリが
吹っ飛んでいるような処理になっています。
i=1処理時にi=20000とかになってしまいデータが壊れてしまったような感じです。
i=0の時はtest[0]="AAA"にはなっているので
そこまでは正しく処理されていいるような感じですが。。。
なにか思い当たる事はありますでしょうか?
ちなみに、例では説明しやすいように"AAA"としてますが、
実際自分の処理は全角日本語でして
"てすと"
"もじれつ"
というようになっています。
"てすと"であれば
(char *)MALLOC(6+1)のようにメモリ確保していますが。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- C言語・C++・C# c言語 配列とポインタについて 3 2023/02/09 22:53
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- Visual Basic(VBA) VBA ユーザーフォームからSubプロージャ―に値を引き渡す方法 3 2023/04/09 01:54
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ビットをローテートするプログ...
-
newしないオブジェクトについて
-
c言語のポインタへの文字列入力...
-
プログラムが途中で強制終了し...
-
allocってなんですか?
-
構造体でchar name[]と*nameの...
-
C言語 mallocとfreeについて
-
c言語のメモリリークについての...
-
大容量の静的な確保の限界値
-
mallocでメモリーを確保しよう...
-
配列の添え字の最大数とは?
-
ポインタのポインタの初期化法
-
free関数で動作が止まる
-
reallocの断片化対策について
-
VBからMFC-DLL呼び出し
-
C++で、メンバもヒープに確保さ...
-
ヒープメモリの解放について
-
malloc関数(strtok関数の自作版...
-
win32APIのHeapAlloc()の使い方...
-
文字列を格納する配列を、動的...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
mallocについて
-
newしないオブジェクトについて
-
allocってなんですか?
-
配列の添え字の最大数とは?
-
ヒープメモリの解放について
-
プログラムが途中で強制終了し...
-
Accessで、メモリを開放するタ...
-
malloc呼び出し時のセグメンテ...
-
ビットをローテートするプログ...
-
C++で、メンバもヒープに確保さ...
-
void*型のデータサイズ
-
入れ子になった構造体について
-
C言語に関する質問
-
スタック破壊の上手な見つけ方...
-
mallocで確保するメモリの領域...
-
C++のnewで確保したメモリーの...
-
指定したメモリアドレスの値の...
-
ヒープ領域の限界値設定
-
構造体でchar name[]と*nameの...
おすすめ情報