ページ 1 / 1
C言語のコードが読み解けないです。
Posted: 2013年6月25日(火) 14:19
by 1919
私は、yahoo知恵袋(
http://detail.chiebukuro.yahoo.co.jp/qa ... 1109269231)C言語でCSVファイルを読みこんで二次元配列に格納する方法を教えてください。と投稿したのですが、回答のコードの意味がいまいちわからないので、コメントをつけて解説していただきたいです。
コピペします。
>>strtok を使えと言いたいところだけれど、
>>strtok は、,, とカンマが続くと馬鹿になるんです。
>>仕方がないので、その辺を for で作って誤魔化しました。
>>もっとも、スペースを読み飛ばしたり、" でくくったりには、対応していません。
コード:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
main(int argc,char **argv){
char *fname;
FILE *fp;
int k,l,i,j;
char word[4096],*tp,*moji[4][4];
if(argc<=1) return -1;
fname = argv[1];
fp = fopen( fname, "r" );
if( fp == NULL ){
printf( "%sファイルが開けません\n", fname );
return -1;
}
l=0;
while(fgets(word,sizeof(word),fp) != 0){
printf("%s",word);
for(k=0,tp=word;*tp!='\n'&&*tp;tp++){
for(j=0;*(tp+j);j++){
if(*(tp+j)=='\n'||*(tp+j)==','){
moji[l][k] = (char*)malloc(j+1);
if(j){
strncpy(moji[l][k],tp,j);
tp += j;
}else moji[l][k][0] = 0;
k++;
break;
}
}
}
l++;
}
for(i=0;i<l;i++){
for(j=0;j<k;j++){
printf("結果%2s ",moji[i][j]);
}
printf("\n");
}
return 0;
}
このような回答いただきましたが、正直私が望んだようにかえってこなかったので自分なりにこれをヒントに書き換えていこうと思ったのですが、書いてあることがいまいち理解できなくて悩んでいます。
このコードをコピペして、実行してみると
結果a\204͋\377 結果ai 結果ae 結果ao 結果ap
i 結果ia 結果io 結果ik 結果iz
u 結果ua 結果ue 結果uo 結果uq
e 結果ei 結果eu 結果em 結果en
o 結果
となってしまいます。雰囲気はあってるのですが、まず、aのあとのエラーの直し方。/204/377 とは何ぞや?とか
i u e o が結果に反映されていない。 多分、改行部分がうまくいってないんだろうなっていうのはわかるんですが、どうしよってなっていまいます。あと、最大の問題点は、説明不足だったのですが、{" ai","ae"・・ のような表示の仕方をしたいのです。ようするに""で囲んで欲しいのです。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月25日(火) 14:27
by non
あのまま、あちらの掲示板を無視するのは、回答していただいた方に失礼です。あちらで、疑問やわからないことを質問した上で、回答が得られないなら、その旨、相互リンクすべきです。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月25日(火) 14:53
by 1919
100ポイント払えないので、回答に対して応答を返すことが出来ないです。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月25日(火) 15:03
by h2so5
100ポイント云々の意味がよくわかりませんが、「質問の補足」を追加すればいいのでは?
Re: C言語のコードが読み解けないです。
Posted: 2013年6月25日(火) 15:29
by non
yahoo知恵袋がどのようなシステムになっているのか使ったことがないのでわからないのですが、ポイントがないとお礼も言えないなんて・・・じゃ、最初からお礼も言わずに済ますつもりだった?
それは、そうとして質問の意味がさっぱりわかりません。
yahooの質問を下に貼り付けました。
C言語でCSVファイルを読みこんで二次元配列に格納する方法を教えてください。
まず、CSVファイルの中身は、
a,ab,ac,ad
b,ba,bc,bd
c,ca,cd,cs
このように文字列になっています。
ソースを載せるとこんな感じです。
fp = fopen( fname, "r" );
if( fp == NULL ){
printf( "%sファイルが開けません¥n", fname );
return -1;
}
while( fgets(word,sizeof(word),fp) != 0){
printf("%s",word);
//////////////////////////////////
ここからわからん。
私のイメージでは、CSVファイルそのままに、二次元配列に格納されて欲しい。
これだと、mozi[0][1] がab みたいな感じにです。
説明も添えて教えていただけるとうれしいです。
ファイルに格納されているデータの個数は、固定ですか、可変ですか?
2次元配列というけど、C言語は文字列を配列に入れているので、3次元配列ではないのか?
yahooの回答のようにポインタを使ったり、mallocを使ったりしていいのか・・・・など。
どっちにしても、私は、yahooの方が解決しないと回答するつもりはありませんが。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月25日(火) 17:27
by M.R
yahoo知恵袋を放置するつもりがないのであれば平行して解決を試みてもらうとして
提示されているソースは文字列の終端が入っていません。
動作させるだけなら
24行目の strncpy の後を
コード:
strncpy( moji[l][k], tp, j );
*(moji[l][k] + j) = '\0';
tp += j;
とでもしておけば想定の動作はします。
不具合を含んでいる所から見てもかなり荒いコードなのでこれをヒントにするのは適切ではないかもしれません。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月25日(火) 21:35
by 1919
解決させました。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月25日(火) 21:36
by 1919
コメントつけて説明お願いします。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月25日(火) 21:49
by h2so5
質問の内容自体が不明瞭です。nonさんの質問に答えてください。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月25日(火) 21:55
by M.R
まずは作った人に聞いてみてください。
見たところ相互リンクもされていないようです。
ベストアンサーに選んでおきながら一方で「意味が分からない~」
と質問するのはかなり失礼な話ですよ。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月25日(火) 21:56
by 1919
ファイルの内容は、可変です。
文字列の場合は、三次元配列のほうがいいのですか? それなら、三次元配列です。すみません。無知識で。
ポインターとかの使用は、おkです。問題ありません。
よろしくお願いします。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月25日(火) 21:57
by 1919
ベストアンサーの人にどうやって聞くのですか?
アドレスとかもないし。聞く手だてがないです。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月25日(火) 21:59
by 1919
M.Rさんの方法でやったら、a/234/456 などの数字が消えて問題が一つ解決しました。ありがとうございます。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月25日(火) 22:45
by non
もう少し質問させてください。
これは、学校の課題でしょうか?
学校の課題なら、正確に課題を記述してください。
どこまで、習っているのか示す必要があります。
また、これが、あなたの自主的な勉強なら、あなたの理解度を教えてください。
といいますのは、データの個数が可変ということなら、配列に格納するのはよい方法とはいえません。
データの最大個数を決めて良いのならいいのですが。
>ベストアンサーの人にどうやって聞くのですか?
お礼が書けるのなら、そこで追加質問ができそうなのですが、それはしてはいけないというルールなのですか?
Re: C言語のコードが読み解けないです。
Posted: 2013年6月25日(火) 22:49
by softya(ソフト屋)
1919 さんが書きました:ベストアンサーの人にどうやって聞くのですか?
アドレスとかもないし。聞く手だてがないです。
コインを使いますが回答リクエストが出来るはずです。
補足を使っていれば、コインも必要なかったのですが。
回答リクエスト時は、相互リンクをお願いします。
さて、
>C言語でCSVファイルを読みこんで二次元配列に格納する方法を教えてください。
そのまま読み込むのなら、もっと簡単で2次元配列で済みます。
,で直ちに区切る必要はないんですよね?
,で区切り、最大値のない可変個数だとリスト構造にしたほうが管理上は便利かもしれません。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月25日(火) 23:50
by 1919
学校の課題ではありません。個人的なやつです。
一通り勉強はしています。
全容を話すと、私は、自動対話プログラム的なのを作ろうと考えています。
その際に、
コード:
//バイナリサーチ//
/////////////////////////////////////////////////////////////////////////////////////////
//配列の中央の要素とキーを比較。 //
//もし等しければ、それが検索対象のデータなので、呼び出し元へ戻る。 //
//もしキーの方が大きければ、キーは中央の要素より右にあるので、中央の要素から右を二分割して探す。 //
//もしキーの方が小さければ、キーは中央の要素より左にあるので、左端の要素から中央の左を二分割して探す。 //
/////////////////////////////////////////////////////////////////////////////////////////
//keyには、検索したい文字、base[]が文字列一覧、topが文字列一覧の数
//注意としては、文字列一覧の先頭は、0で定義する。それ以外でも、大丈夫だけど・・・
int binary_search(char *key,char *base[],int top)
{
int middle;
int temp;
int bottom=0;
while(1){
if(top==bottom+1){
return(-1);
}
middle = (bottom+top)/2;
if((temp = strcmp(key, base[middle])) == 0)
return (middle);
if (temp > 0) {
if(bottom==0){
bottom=middle;
}else{
bottom = middle;
}
}else if(temp<0){
top=middle;
}
}
return 0;
}
char *base[NUM_DATA] = {"0","atto", "centi", "deca", "deci",
"exa", "femto", "giga", "hecto",
"kilo", "mega", "micro", "milli",
"nano", "peta", "pico", "saitou","tera","yuki"
};
中身がこんな感じだとすると、これを二分割してさがす関数を書きました。
なので、これを活用して、CSVファイルから縦にa、i、u、e、o にして横をaからはじまって小さい長さの文字を・・
なので、これを上記のような形で表して、自作関数をつかって文字を探索します、そして、CSVファイルに対応した相対的な回答用CSVファイルを作成し、見つけた文字列と同じ場所の相対的なCSVファイルを読み出して、 聞かれたことを返す 自動対話プログラムを作りたいのです。
そして、あわよくば、聞かれたことを学習するためにCSVに書き出す機能も欲しいです。
ですが、まずは、CSVファイルを上記のような形にしないといけないので、中途半端な説明になってしまいました。すみません。
これを聞いた上でなんかよい方法とかありますか?
Re: C言語のコードが読み解けないです。
Posted: 2013年6月25日(火) 23:58
by softya(ソフト屋)
a,i,uに分けるのは高速検索のためでしょうか?
それなら読み込む時に分類したほうが効率が良いと思います。
それとキーワードが驚異的に増えた時のためにツリー構造やハッシュ検索まで考慮したほうが良いです。
つまり、基礎
アリゴリズムアルゴリズムを学ぶと効率のよいやりかたも見えてくるよと言う話になります。
上にも書きましたが、最低限リスト構造にはしたほうが良いと思います。
参考リンク。
「ポインタを使ったデータ構造」
http://wwws.kobe-c.ac.jp/deguchi/c/list/frame.html
「Programming Place Plus アルゴリズムとデータ構造編 トップページ」
http://www.geocities.jp/ky_webid/Progra ... index.html
「コーディングに役立つ! アルゴリズムの基本 - @IT」
http://www.atmarkit.co.jp/fcoding/index/algorithm.html
「C言語講座>アルゴリズム研究室(トップ)」
http://www1.cts.ne.jp/~clab/algorithm/algorithm.html
Re: C言語のコードが読み解けないです。
Posted: 2013年6月26日(水) 00:59
by 1919
ほうほう!
アルゴリズムを勉強します。
ありがとうございます。
まずは、リスト構造と初手のアルゴリズムを学んで出直したいと思います。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月26日(水) 06:47
by non
やっと、話が見えました。
1919さんが考えている方法に一番近いのはリスト構造でしょう。最後はデータベースに行きつくでしょうけど。
まず、csvファイルは、カンマ区切りでなく、スペース区切りで考えた方が最初は楽です。
また、aiueoで分類するのは、後で考えるとして、最初は1本のリスト構造で考える方が、参考になるホームページも多く
楽でしょう。さらに、単語をダブルクオーテーションで囲む必要もありません。
課題として作るならこのようになります。
単語がたくさん格納された改行、TAB、スペース区切りのテキストファイルを読み込み、単方向のリスト構造を単語のアスキー順に作成せよ。
がんばってください。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月26日(水) 11:21
by 1919
このコードって今じゃ直せないですか?
Re: C言語のコードが読み解けないです。
Posted: 2013年6月26日(水) 11:21
by 1919
わかりました。ありがとうございました・
Re: C言語のコードが読み解けないです。
Posted: 2013年6月26日(水) 12:14
by non
1919 さんが書きました:このコードって今じゃ直せないですか?
char *moji[4][4];
データ(単語数)が4×4 しか用意されてません。
ここを、*moji[1000][100] などにすれば、対応できるでしょう。
しかし、メモリの効率が悪いですね。
学校の課題なら、小手先の修正で提出するのも、いいかも知れませんが、自分のための
勉強なら、もっと基本から学ぶようにした方が、結局は近道です。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月26日(水) 14:50
by 1919
mojiz[4][4]になってるから当然ですが、まだ、解決してない、残ってる、二つの問題点です。
せめてそこだけでもいいので解決しないと中途半端のままで終わってしまいいやです。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月26日(水) 15:06
by usao
どうしても M*N の2次元的な形に読み込みたいんだ!ということであれば
「ファイル先頭にMとNの値を書いておくルール」とかにしてしまえば大分楽になると思いますけど…ダメ?
Re: C言語のコードが読み解けないです。
Posted: 2013年6月26日(水) 15:07
by softya(ソフト屋)
そもそも勉強の為だと思うので、printfデバッグ法を伝授するので自分で解析してみてください。
「簡単RPG講座 番外編。 デバッグ入門 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/blog.php?u=114&b=982&c=2
あと変数名が、k, l, i, jなのも解析を難しくしている原因だと思います。変数名を変えてさらに自分で分かりやすように命令文を一行一行コメントを書いてみてください。
その上で、ここの動作がわからないとか、ここからここの間の動きが不明とか質問してもらったほうが良いと思います。
その場合は、自分でコメントを書いて、ちゃんとインデントしたソースをcodeタグで投稿してくださいね。
【補足】そうでもしないと分かったつもりになる危険性が高いです。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月26日(水) 15:19
by non
1919 さんが書きました:mojiz[4][4]になってるから当然ですが、まだ、解決してない、残ってる、二つの問題点です。
ちなみに、二つの問題点とは何ですか?
Re: C言語のコードが読み解けないです。
Posted: 2013年6月27日(木) 11:40
by 1919
i u e o が結果に反映されていない。 多分、改行部分がうまくいってないんだろうなっていうのはわかるんですが、どうしよってなっていまいます。あと、最大の問題点は、説明不足だったのですが、{" ai","ae"・・ のような表示の仕方をしたいのです。ようするに""で囲んで欲しいのです。
結果a結果ai 結果ae 結果ao 結果ap
i 結果ia 結果io 結果ik 結果iz
u 結果ua 結果ue 結果uo 結果uq
e 結果ei 結果eu 結果em 結果en
o 結果
こうなっちゃいます。
Re: C言語のコードが読み解けないです。
Posted: 2013年6月27日(木) 12:33
by softya(ソフト屋)
私のデバッグ法は試されてのでしょうか?
あと色々書いたのですが、どれも実践されていないんでしょうか?
Re: C言語のコードが読み解けないです。
Posted: 2013年6月27日(木) 17:37
by non
1919 さんが書きました:i u e o が結果に反映されていない。 多分、改行部分がうまくいってないんだろうなっていうのはわかるんですが、どうしよってなっていまいます。
mojiz の配列個数を変えてみてもだめなのですか。
追記
No6で指摘された訂正もしてますよね。
1919 さんが書きました:
あと、最大の問題点は、説明不足だったのですが、{" ai","ae"・・ のような表示の仕方をしたいのです。ようするに""で囲んで欲しいのです。
printfでダブルコーテーションを出力する方法がわからないという意味なのでしょうか?
Re: C言語のコードが読み解けないです。
Posted: 2013年7月02日(火) 02:22
by 1919
いわれたようにやってみました。 ちょっと見てください。
コード:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc,char **argv){
char *fname= "sample.csv";
FILE *fp;
int k,l,i,j;
char word[4096],*tp,*moji[4][4];
int count = 0;
fp = fopen( fname, "r" );
if( fp == NULL ){
printf( "%sファイルが開けません\n", fname );
return -1;
}
l=0;
while(fgets(word,sizeof(word),fp) != 0){
printf("%s\n\n\n",word);
for(k=0,tp=word;*tp;tp++){ //tpが足されている。もし、*tp!='\n'
printf("tpの値%s\n\n\n",tp);
for(j=0;*(tp+j);++j){ //jは足してっていつ、'\n'か","になるのかを確認している。
printf("tp+Jの値%s\n\n\n",(tp+j));
if(*(tp+j)== '\n' ||*(tp+j)==','){
moji[l][k] = (char*)malloc(j+1);//多分ゼロまでだから、
if(j){
printf("Jの値= %d\n\n",j);
count++;
strncpy( moji[l][k], tp, j ); //moji[l][k]にtpの値 + jバイト コピーする。
*(moji[l][k] + j) = '\0'; //moji[j][k]= , または、 ¥n に0を代入。
tp += j;
}else moji[l][k][0] = 0;
k++;
break;
}
}
}
l++;
}
for(i=0;i<l;i++){
for(j=0;j<k;j++){
printf("結果%2s ",moji[i][j]);
}
printf("\n");
}
return 0;
}
このようにしていろいろ確認してみたところ問題がわかりました。
tp+Jの値p
i,ia,io,ik,iz
u,ua,ue,uo,uq
e,ei,eu,em,en
o,oa,oi,ow,oz
tp+Jの値
i,ia,io,ik,iz
u,ua,ue,uo,uq
e,ei,eu,em,en
o,oa,oi,ow,oz
tp+Jの値i,ia,io,ik,iz
u,ua,ue,uo,uq
e,ei,eu,em,en
o,oa,oi,ow,oz
tp+Jの値,ia,io,ik,iz
u,ua,ue,uo,uq
e,ei,eu,em,en
o,oa,oi,ow,oz
Jの値= 4
このようにJが本当は改行で終わるはずなのに(本当は2)続けて足されているせいでi,u,e,o が前のとつながってmojiに代入されてるので、結果が、結果ap i このように表示されてしまうとわかったのですが、問題はここからで、
なぜ、'\n' かがわかりません。
教えていただけないでしょうか?
質問遅れてすみません・
Re: C言語のコードが読み解けないです。
Posted: 2013年7月02日(火) 02:24
by 1919
訂正です。
なぜ、 '\n' が 反映されずに処理されてしまったのかがわかりません。
Re: C言語のコードが読み解けないです。
Posted: 2013年7月02日(火) 08:40
by non
これを行ったときの、sample.csv を添付してください。
Re: C言語のコードが読み解けないです。
Posted: 2013年7月02日(火) 10:33
by 1919
0 ai ae ao ap
i ia io ik iz
u ua ue uo uq
e ei eu em en
o oa oi ow oz
こんな感じに保存されています。
Re: C言語のコードが読み解けないです。
Posted: 2013年7月02日(火) 11:24
by M.R
まず *moji[4][4] に対して 4以上でアクセスしている事は問題です
k = 4の時に
moji[l][k] = (char*)malloc(j+1);
あと想定している出力結果を試しに書いてもらった方がよいのではないでしょうか
Re: C言語のコードが読み解けないです。
Posted: 2013年7月02日(火) 12:07
by non
何度、データの個数の件を書けば、理解してもらえるのかな?
int a[4];
と宣言したら、a[0],a[1],a[2],a[3]の4個の配列が用意されます。5個ではありません。
また、データはカンマ区切りでなかったの?こっちは、単なる書き間違いかも知れないけど。
Re: C言語のコードが読み解けないです。
Posted: 2013年7月02日(火) 12:15
by 1919
配列の[4] とかに関しては間違ってた。それはいいとして、
CSVファイルで読み込んだことありますか?
CSVファイルを読み込むと
カンマとして表示される。
読み込んだあとのwordの内容は、
0,ai,ae,ao,ap
i,ia,io,ik,iz
u,ua,ue,uo,uq
e,ei,eu,em,en
o,oa,oi,ow,oz
これです。
CSVファイルの内容は、
0 ai ae ao ap
i ia io ik iz
u ua ue uo uq
e ei eu em en
o oa oi ow oz
これです。
Re: C言語のコードが読み解けないです。
Posted: 2013年7月02日(火) 12:26
by non
1919 さんが書きました:
CSVファイルを読み込むと
カンマとして表示される。
読み込んだあとのwordの内容は、
0,ai,ae,ao,ap
i,ia,io,ik,iz
u,ua,ue,uo,uq
e,ei,eu,em,en
o,oa,oi,ow,oz
これです。
CSVファイルの内容は、
0 ai ae ao ap
i ia io ik iz
u ua ue uo uq
e ei eu em en
o oa oi ow oz
これです。
ごめんなさい。仰っている意味がわかりません。
ファイルをメモ帳で開いてみてください。EXCELで開いちゃだめですよ。
Re: C言語のコードが読み解けないです。
Posted: 2013年7月02日(火) 12:53
by M.R
CSVファイルというのは結局はテキストデータです。
基本的にはエクセルのセル情報をカンマで区切ったものです。
動作を見る限りカンマ区切りをされている事は間違いないようですが
返答からでは
CSVファイルの中身を知らないだけなのか
本当に1セルにスペース区切りで入力しているのか
判断に迷う事があるのです。
あと範囲外参照([4])は良しとしてはいけません。
その後の動作が全く予想できないものになり、前に進む事ができません。
Re: C言語のコードが読み解けないです。
Posted: 2013年7月02日(火) 13:04
by box
1919 さんが書きました:
CSVファイルの内容は、
0 ai ae ao ap
i ia io ik iz
u ua ue uo uq
e ei eu em en
o oa oi ow oz
これです。
私も、他の回答者さん同様、おっしゃっている内容がよくわかりません。
csv(comma separated value)というのは、その名のとおり
項目間を「カンマで区切っている」わけであります。
上記の、「どう見てもカンマで区切っているようには見えない」内容のファイルを
csvファイルであるというのは何か勘違いをされているように思えてなりません。
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 01:34
by 1919
a[4]とかに関しては、かえるのを忘れていただけで、直してます。
論点ずらさないでいただけないでしょうか?
わからないのならわからないといっていただければ楽なのですが、
どっちなんですか?
わかるなら、質問に答えていただけませんか?
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 01:40
by 1919
前回とかわってないですがCSVに関しては、出力すると、,で区切ってあります。
ともかく、回答急いでいただきたい。
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 08:53
by non
1919 さんが書きました:
論点ずらさないでいただけないでしょうか?
わからないのならわからないといっていただければ楽なのですが、
どっちなんですか?
論点をずらしているつもりはありませんが、わかりませんと前から言ってます。
もちろん、わからないのはプログラムではなく、あなたが考えていることです。
相手がわからないと言ってるのだから、あなたがわかるように説明してもらわないと困ります。
コミュニケーションがうまく取れないのは、話し手側に問題があります。聞き手側に問題があるのではありません。
さて、あなたが、作ったプログラムを、*moji[10][10] に変えて、
データを
0,ai,ae,ao,ap
i,ia,io,ik,iz
u,ua,ue,uo,uq
e,ei,eu,em,en
o,oa,oi,ow,oz
にしたときの結果を添付しました。
どこが、あなたが気に入らないのか、示してください。
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 10:02
by usao
なんというか文面が全体的に,何について言っているのか?がに本人にしかわからない書き方になってるというか
今現在,
・何がどうなるべき なのに
・実際はどうなっていて
・ご自身のデバッグ作業で何を掴んで&何を修正して
・それでもなお残っている問題は何なのか&何についての回答を望まれておられるのか
というのが少なくとも私には「わかりません」なのですけれども,
>直してます
であるのならば,直した結果挙動がどう変わってどうの…っていうことを示さないと
現状に対する有効な回答は得られないのではないかな?と.
それとも現状は現状でまともな状態にあって,知りたいことは何か別の(過去の?)事柄なのでしょうか?
(それはそれで意味不明ですが)
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 10:55
by M.R
上記の回答は後付けのものではありませんよ。
No.34 の段階で
>あと想定している出力結果を試しに書いてもらった方がよいのではないでしょうか
と回答していますよ
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 11:03
by ilish
横から失礼しますが、皆さんはただ難癖つけてるだけではないですか?
なんで質問の意味を理解していないと言ってるのにサンプルコードを教えられるんですか?
*ほかのトピックもいろいろ見ましたが、それらも難癖つけて、投稿者が考えに考えぬいてだした結論が間違っていると、やれデバックしろだの、理解ができていないですね、だの質問者の意欲を欠く回答ばかり・・・
ここの掲示板って、とある団体がやっててなんか回答か質問かしまくれば上がる「ハッカー」なり称号をよりよくするために遊んでいるのですか?
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 11:18
by 1919
illishさん どうもです。
nonさんがうまく表示された理由がわからないです。
私のは、mac の xcodeで書いてあるのですが
結果0 結果ai 結果ae 結果ao 結果ap
i 結果ia 結果io 結果ik 結果iz
u 結果ua 結果ue 結果uo 結果uq
e 結果ei 結果eu 結果em 結果en
o 結果oa 結果oi 結果ow
こんなことになるのですがなぜですか?
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 11:26
by non
2行目から最初に「結果」が表示されないということと、最後のデータが出てないと言うことですね。
プログラムとデータを見ないとわかりません。
プログラムソースとCSVファイルを、ファイル添付してください。
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 11:29
by 1919
CSVファイルもソースも載せてます。前のページ見てください。
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 11:32
by M.R
結果が違うのであればやはり
*moji[4][4]
の範囲外参照の可能性が考えられますね。
そこを解決してみてください
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 11:38
by non
もちろん、その添付されたもので、確認し、実行したものが、私が載せた出力です。
それでは、正しく動いているのだから、あなたのファイルを直接確認したかっただけです。
環境が違うから。こちらではこれ以上確認できません。他の方の、回答を待ってください。
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 11:41
by M.R
>そこを解決してみてください
*moji[4][4] を
*moji[10][10] に変えて実行してください
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 11:49
by 1919
mozi[4][4]からmozi[10][10]に変えてます。 かわりません。
これは、xcodeが悪いのか?
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 12:29
by M.R
ソースに違いがなければ環境のせいと思われますが
少々解せない結果ですね
csvの例のようにまだ何か勘違いがある可能性もありますが
試しに以下のコードの結果はどうなりますか?
コード:
int k,l,i,j;
char moji[5][5][3] = {
{"0", "ai", "ae", "ao", "ap"},
{"i", "ia", "io", "ik", "iz"},
{"u", "ua", "ue", "uo", "uq"},
{"e", "ei", "eu", "em", "en"},
{"o", "oa", "oi", "ow", "oz"},
};
for(i=0;i<5;i++){
for(j=0;j<5;j++){
printf("結果%2s ",moji[i][j]);
}
printf("\n");
}
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 12:42
by non
私のソースと、CSVファイルを添付します。
これに変えてみても結果が同じか検証してください。
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 14:44
by 1919
おお!! できました。
ありがとうございます。
CSVファイルが悪かったと思われます。
中身を確認したところ、私が作ったCSVと一緒なのになぜかできなかった。
私の予測としては、マイクロソフトとかのエクセルなどだと、MACやxpや8でそれぞれ形式が違ったり(要するに枠の大きさとか)
するときがあって講義とかでマイクロソフトのwordをMACから7とかに入れて起動させるとずれてしまうこともあるので、それが原因かなと思うですがどう思いますか?
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 15:50
by non
動いてよかったですね。CSVファイルはただのテキストファイルですから、環境で違うとは思えないのですが、EXCELを立ち上げる必要もないし。
添付してもらえるなら、チェックします。
追記
MACでは、改行コードが違うのですね。勉強になりました。
Mac OS XやUNIXではLF(0AH)
Mac OS 9以前ではCR(0DH)
WindowsではCR+LF(0DH+0AH)
Re: C言語のコードが読み解けないです。
Posted: 2013年7月03日(水) 15:58
by M.R
結果から予想するに
改行コードの違いではないでしょうか CR+LF、LF
双方のcsvデータをバイナリーエディタなどで開いて確認すれば違いが判るはずです。