C言語のコードが読み解けないです。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
1919

C言語のコードが読み解けないです。

#1

投稿記事 by 1919 » 12年前

私は、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"・・ のような表示の仕方をしたいのです。ようするに""で囲んで欲しいのです。

non
記事: 1097
登録日時: 15年前

Re: C言語のコードが読み解けないです。

#2

投稿記事 by non » 12年前

あのまま、あちらの掲示板を無視するのは、回答していただいた方に失礼です。あちらで、疑問やわからないことを質問した上で、回答が得られないなら、その旨、相互リンクすべきです。
non

1919

Re: C言語のコードが読み解けないです。

#3

投稿記事 by 1919 » 12年前

100ポイント払えないので、回答に対して応答を返すことが出来ないです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: C言語のコードが読み解けないです。

#4

投稿記事 by h2so5 » 12年前

100ポイント云々の意味がよくわかりませんが、「質問の補足」を追加すればいいのでは?

non
記事: 1097
登録日時: 15年前

Re: C言語のコードが読み解けないです。

#5

投稿記事 by non » 12年前

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の方が解決しないと回答するつもりはありませんが。
non

M.R

Re: C言語のコードが読み解けないです。

#6

投稿記事 by M.R » 12年前

yahoo知恵袋を放置するつもりがないのであれば平行して解決を試みてもらうとして
提示されているソースは文字列の終端が入っていません。
動作させるだけなら
24行目の strncpy の後を

コード:

	strncpy( moji[l][k], tp, j );
	*(moji[l][k] + j) = '\0';
	tp += j;
とでもしておけば想定の動作はします。

不具合を含んでいる所から見てもかなり荒いコードなのでこれをヒントにするのは適切ではないかもしれません。

1919

Re: C言語のコードが読み解けないです。

#7

投稿記事 by 1919 » 12年前

解決させました。

1919

Re: C言語のコードが読み解けないです。

#8

投稿記事 by 1919 » 12年前

コメントつけて説明お願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: C言語のコードが読み解けないです。

#9

投稿記事 by h2so5 » 12年前

質問の内容自体が不明瞭です。nonさんの質問に答えてください。

M.R

Re: C言語のコードが読み解けないです。

#10

投稿記事 by M.R » 12年前

まずは作った人に聞いてみてください。
見たところ相互リンクもされていないようです。

ベストアンサーに選んでおきながら一方で「意味が分からない~」
と質問するのはかなり失礼な話ですよ。

1919

Re: C言語のコードが読み解けないです。

#11

投稿記事 by 1919 » 12年前

ファイルの内容は、可変です。
文字列の場合は、三次元配列のほうがいいのですか? それなら、三次元配列です。すみません。無知識で。
ポインターとかの使用は、おkです。問題ありません。
よろしくお願いします。

1919

Re: C言語のコードが読み解けないです。

#12

投稿記事 by 1919 » 12年前

ベストアンサーの人にどうやって聞くのですか?
アドレスとかもないし。聞く手だてがないです。

1919

Re: C言語のコードが読み解けないです。

#13

投稿記事 by 1919 » 12年前

M.Rさんの方法でやったら、a/234/456 などの数字が消えて問題が一つ解決しました。ありがとうございます。

non
記事: 1097
登録日時: 15年前

Re: C言語のコードが読み解けないです。

#14

投稿記事 by non » 12年前

もう少し質問させてください。
これは、学校の課題でしょうか?
学校の課題なら、正確に課題を記述してください。
どこまで、習っているのか示す必要があります。
また、これが、あなたの自主的な勉強なら、あなたの理解度を教えてください。
といいますのは、データの個数が可変ということなら、配列に格納するのはよい方法とはいえません。
データの最大個数を決めて良いのならいいのですが。

>ベストアンサーの人にどうやって聞くのですか?
お礼が書けるのなら、そこで追加質問ができそうなのですが、それはしてはいけないというルールなのですか?
non

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C言語のコードが読み解けないです。

#15

投稿記事 by softya(ソフト屋) » 12年前

1919 さんが書きました:ベストアンサーの人にどうやって聞くのですか?
アドレスとかもないし。聞く手だてがないです。
コインを使いますが回答リクエストが出来るはずです。
補足を使っていれば、コインも必要なかったのですが。
回答リクエスト時は、相互リンクをお願いします。

さて、
>C言語でCSVファイルを読みこんで二次元配列に格納する方法を教えてください。

そのまま読み込むのなら、もっと簡単で2次元配列で済みます。
,で直ちに区切る必要はないんですよね?

,で区切り、最大値のない可変個数だとリスト構造にしたほうが管理上は便利かもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

1919

Re: C言語のコードが読み解けないです。

#16

投稿記事 by 1919 » 12年前

学校の課題ではありません。個人的なやつです。
一通り勉強はしています。
全容を話すと、私は、自動対話プログラム的なのを作ろうと考えています。
その際に、

コード:

//バイナリサーチ//
/////////////////////////////////////////////////////////////////////////////////////////
//配列の中央の要素とキーを比較。                                                            //
//もし等しければ、それが検索対象のデータなので、呼び出し元へ戻る。                                //
//もしキーの方が大きければ、キーは中央の要素より右にあるので、中央の要素から右を二分割して探す。        //
//もしキーの方が小さければ、キーは中央の要素より左にあるので、左端の要素から中央の左を二分割して探す。  //
/////////////////////////////////////////////////////////////////////////////////////////

//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ファイルを上記のような形にしないといけないので、中途半端な説明になってしまいました。すみません。
これを聞いた上でなんかよい方法とかありますか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C言語のコードが読み解けないです。

#17

投稿記事 by softya(ソフト屋) » 12年前

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
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

1919

Re: C言語のコードが読み解けないです。

#18

投稿記事 by 1919 » 12年前

ほうほう!
アルゴリズムを勉強します。
ありがとうございます。

まずは、リスト構造と初手のアルゴリズムを学んで出直したいと思います。

non
記事: 1097
登録日時: 15年前

Re: C言語のコードが読み解けないです。

#19

投稿記事 by non » 12年前

やっと、話が見えました。
1919さんが考えている方法に一番近いのはリスト構造でしょう。最後はデータベースに行きつくでしょうけど。

まず、csvファイルは、カンマ区切りでなく、スペース区切りで考えた方が最初は楽です。
また、aiueoで分類するのは、後で考えるとして、最初は1本のリスト構造で考える方が、参考になるホームページも多く
楽でしょう。さらに、単語をダブルクオーテーションで囲む必要もありません。

課題として作るならこのようになります。
単語がたくさん格納された改行、TAB、スペース区切りのテキストファイルを読み込み、単方向のリスト構造を単語のアスキー順に作成せよ。

がんばってください。
non

1919

Re: C言語のコードが読み解けないです。

#20

投稿記事 by 1919 » 12年前

このコードって今じゃ直せないですか?

1919

Re: C言語のコードが読み解けないです。

#21

投稿記事 by 1919 » 12年前

わかりました。ありがとうございました・

non
記事: 1097
登録日時: 15年前

Re: C言語のコードが読み解けないです。

#22

投稿記事 by non » 12年前

1919 さんが書きました:このコードって今じゃ直せないですか?
char *moji[4][4];
データ(単語数)が4×4 しか用意されてません。
ここを、*moji[1000][100] などにすれば、対応できるでしょう。
しかし、メモリの効率が悪いですね。

学校の課題なら、小手先の修正で提出するのも、いいかも知れませんが、自分のための
勉強なら、もっと基本から学ぶようにした方が、結局は近道です。
non

1919

Re: C言語のコードが読み解けないです。

#23

投稿記事 by 1919 » 12年前

mojiz[4][4]になってるから当然ですが、まだ、解決してない、残ってる、二つの問題点です。
せめてそこだけでもいいので解決しないと中途半端のままで終わってしまいいやです。

アバター
usao
記事: 1892
登録日時: 13年前
連絡を取る:

Re: C言語のコードが読み解けないです。

#24

投稿記事 by usao » 12年前

どうしても M*N の2次元的な形に読み込みたいんだ!ということであれば
「ファイル先頭にMとNの値を書いておくルール」とかにしてしまえば大分楽になると思いますけど…ダメ?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C言語のコードが読み解けないです。

#25

投稿記事 by softya(ソフト屋) » 12年前

そもそも勉強の為だと思うので、printfデバッグ法を伝授するので自分で解析してみてください。
「簡単RPG講座 番外編。 デバッグ入門 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/blog.php?u=114&b=982&c=2

あと変数名が、k, l, i, jなのも解析を難しくしている原因だと思います。変数名を変えてさらに自分で分かりやすように命令文を一行一行コメントを書いてみてください。
その上で、ここの動作がわからないとか、ここからここの間の動きが不明とか質問してもらったほうが良いと思います。
その場合は、自分でコメントを書いて、ちゃんとインデントしたソースをcodeタグで投稿してくださいね。

【補足】そうでもしないと分かったつもりになる危険性が高いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

non
記事: 1097
登録日時: 15年前

Re: C言語のコードが読み解けないです。

#26

投稿記事 by non » 12年前

1919 さんが書きました:mojiz[4][4]になってるから当然ですが、まだ、解決してない、残ってる、二つの問題点です。
ちなみに、二つの問題点とは何ですか?
non

1919

Re: C言語のコードが読み解けないです。

#27

投稿記事 by 1919 » 12年前

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 結果
こうなっちゃいます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C言語のコードが読み解けないです。

#28

投稿記事 by softya(ソフト屋) » 12年前

私のデバッグ法は試されてのでしょうか?
あと色々書いたのですが、どれも実践されていないんでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

non
記事: 1097
登録日時: 15年前

Re: C言語のコードが読み解けないです。

#29

投稿記事 by non » 12年前

1919 さんが書きました:i u e o が結果に反映されていない。  多分、改行部分がうまくいってないんだろうなっていうのはわかるんですが、どうしよってなっていまいます。
mojiz の配列個数を変えてみてもだめなのですか。

追記
No6で指摘された訂正もしてますよね。
1919 さんが書きました: あと、最大の問題点は、説明不足だったのですが、{" ai","ae"・・ のような表示の仕方をしたいのです。ようするに""で囲んで欲しいのです。
printfでダブルコーテーションを出力する方法がわからないという意味なのでしょうか?
non

1919

Re: C言語のコードが読み解けないです。

#30

投稿記事 by 1919 » 12年前

いわれたようにやってみました。 ちょっと見てください。

コード:

#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' かがわかりません。
教えていただけないでしょうか?
質問遅れてすみません・

1919

Re: C言語のコードが読み解けないです。

#31

投稿記事 by 1919 » 12年前

訂正です。
なぜ、 '\n' が 反映されずに処理されてしまったのかがわかりません。

non
記事: 1097
登録日時: 15年前

Re: C言語のコードが読み解けないです。

#32

投稿記事 by non » 12年前

これを行ったときの、sample.csv を添付してください。
non

1919

Re: C言語のコードが読み解けないです。

#33

投稿記事 by 1919 » 12年前

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

こんな感じに保存されています。

M.R

Re: C言語のコードが読み解けないです。

#34

投稿記事 by M.R » 12年前

まず *moji[4][4] に対して 4以上でアクセスしている事は問題です
k = 4の時に
moji[l][k] = (char*)malloc(j+1);

あと想定している出力結果を試しに書いてもらった方がよいのではないでしょうか

non
記事: 1097
登録日時: 15年前

Re: C言語のコードが読み解けないです。

#35

投稿記事 by non » 12年前

何度、データの個数の件を書けば、理解してもらえるのかな?

int a[4];
と宣言したら、a[0],a[1],a[2],a[3]の4個の配列が用意されます。5個ではありません。

また、データはカンマ区切りでなかったの?こっちは、単なる書き間違いかも知れないけど。
non

1919

Re: C言語のコードが読み解けないです。

#36

投稿記事 by 1919 » 12年前

配列の[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
これです。

non
記事: 1097
登録日時: 15年前

Re: C言語のコードが読み解けないです。

#37

投稿記事 by non » 12年前

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で開いちゃだめですよ。
non

M.R

Re: C言語のコードが読み解けないです。

#38

投稿記事 by M.R » 12年前

CSVファイルというのは結局はテキストデータです。
基本的にはエクセルのセル情報をカンマで区切ったものです。

動作を見る限りカンマ区切りをされている事は間違いないようですが
返答からでは
 CSVファイルの中身を知らないだけなのか
 本当に1セルにスペース区切りで入力しているのか
判断に迷う事があるのです。

あと範囲外参照([4])は良しとしてはいけません。
その後の動作が全く予想できないものになり、前に進む事ができません。

box
記事: 2002
登録日時: 15年前

Re: C言語のコードが読み解けないです。

#39

投稿記事 by box » 12年前

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ファイルであるというのは何か勘違いをされているように思えてなりません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

1919

Re: C言語のコードが読み解けないです。

#40

投稿記事 by 1919 » 12年前

a[4]とかに関しては、かえるのを忘れていただけで、直してます。

論点ずらさないでいただけないでしょうか?
わからないのならわからないといっていただければ楽なのですが、
どっちなんですか?

わかるなら、質問に答えていただけませんか?

1919

Re: C言語のコードが読み解けないです。

#41

投稿記事 by 1919 » 12年前

前回とかわってないですがCSVに関しては、出力すると、,で区切ってあります。
ともかく、回答急いでいただきたい。

non
記事: 1097
登録日時: 15年前

Re: C言語のコードが読み解けないです。

#42

投稿記事 by non » 12年前

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
にしたときの結果を添付しました。
どこが、あなたが気に入らないのか、示してください。
添付ファイル
out.txt
(2.65 KiB) ダウンロード数: 191 回
non

アバター
usao
記事: 1892
登録日時: 13年前
連絡を取る:

Re: C言語のコードが読み解けないです。

#43

投稿記事 by usao » 12年前

なんというか文面が全体的に,何について言っているのか?がに本人にしかわからない書き方になってるというか
今現在,
・何がどうなるべき なのに
・実際はどうなっていて
・ご自身のデバッグ作業で何を掴んで&何を修正して
・それでもなお残っている問題は何なのか&何についての回答を望まれておられるのか
というのが少なくとも私には「わかりません」なのですけれども,

>直してます
であるのならば,直した結果挙動がどう変わってどうの…っていうことを示さないと
現状に対する有効な回答は得られないのではないかな?と.
それとも現状は現状でまともな状態にあって,知りたいことは何か別の(過去の?)事柄なのでしょうか?
(それはそれで意味不明ですが)

M.R

Re: C言語のコードが読み解けないです。

#44

投稿記事 by M.R » 12年前

上記の回答は後付けのものではありませんよ。
No.34 の段階で
>あと想定している出力結果を試しに書いてもらった方がよいのではないでしょうか
と回答していますよ

ilish

Re: C言語のコードが読み解けないです。

#45

投稿記事 by ilish » 12年前

横から失礼しますが、皆さんはただ難癖つけてるだけではないですか?

なんで質問の意味を理解していないと言ってるのにサンプルコードを教えられるんですか?

*ほかのトピックもいろいろ見ましたが、それらも難癖つけて、投稿者が考えに考えぬいてだした結論が間違っていると、やれデバックしろだの、理解ができていないですね、だの質問者の意欲を欠く回答ばかり・・・

ここの掲示板って、とある団体がやっててなんか回答か質問かしまくれば上がる「ハッカー」なり称号をよりよくするために遊んでいるのですか?

1919

Re: C言語のコードが読み解けないです。

#46

投稿記事 by 1919 » 12年前

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
こんなことになるのですがなぜですか?

non
記事: 1097
登録日時: 15年前

Re: C言語のコードが読み解けないです。

#47

投稿記事 by non » 12年前

2行目から最初に「結果」が表示されないということと、最後のデータが出てないと言うことですね。
プログラムとデータを見ないとわかりません。
プログラムソースとCSVファイルを、ファイル添付してください。
non

1919

Re: C言語のコードが読み解けないです。

#48

投稿記事 by 1919 » 12年前

CSVファイルもソースも載せてます。前のページ見てください。

M.R

Re: C言語のコードが読み解けないです。

#49

投稿記事 by M.R » 12年前

結果が違うのであればやはり
*moji[4][4]
の範囲外参照の可能性が考えられますね。

そこを解決してみてください

non
記事: 1097
登録日時: 15年前

Re: C言語のコードが読み解けないです。

#50

投稿記事 by non » 12年前

もちろん、その添付されたもので、確認し、実行したものが、私が載せた出力です。
それでは、正しく動いているのだから、あなたのファイルを直接確認したかっただけです。
環境が違うから。こちらではこれ以上確認できません。他の方の、回答を待ってください。
non

M.R

Re: C言語のコードが読み解けないです。

#51

投稿記事 by M.R » 12年前

>そこを解決してみてください
*moji[4][4] を
*moji[10][10] に変えて実行してください

1919

Re: C言語のコードが読み解けないです。

#52

投稿記事 by 1919 » 12年前

mozi[4][4]からmozi[10][10]に変えてます。 かわりません。
これは、xcodeが悪いのか?

M.R

Re: C言語のコードが読み解けないです。

#53

投稿記事 by M.R » 12年前

ソースに違いがなければ環境のせいと思われますが
少々解せない結果ですね
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");
	}

non
記事: 1097
登録日時: 15年前

Re: C言語のコードが読み解けないです。

#54

投稿記事 by non » 12年前

私のソースと、CSVファイルを添付します。
これに変えてみても結果が同じか検証してください。
添付ファイル
test.zip
(1017 バイト) ダウンロード数: 105 回
non

1919

Re: C言語のコードが読み解けないです。

#55

投稿記事 by 1919 » 12年前

おお!! できました。
ありがとうございます。
CSVファイルが悪かったと思われます。
中身を確認したところ、私が作ったCSVと一緒なのになぜかできなかった。
私の予測としては、マイクロソフトとかのエクセルなどだと、MACやxpや8でそれぞれ形式が違ったり(要するに枠の大きさとか)
するときがあって講義とかでマイクロソフトのwordをMACから7とかに入れて起動させるとずれてしまうこともあるので、それが原因かなと思うですがどう思いますか?

non
記事: 1097
登録日時: 15年前

Re: C言語のコードが読み解けないです。

#56

投稿記事 by non » 12年前

動いてよかったですね。CSVファイルはただのテキストファイルですから、環境で違うとは思えないのですが、EXCELを立ち上げる必要もないし。
添付してもらえるなら、チェックします。


追記
MACでは、改行コードが違うのですね。勉強になりました。
Mac OS XやUNIXではLF(0AH)
Mac OS 9以前ではCR(0DH)
WindowsではCR+LF(0DH+0AH)
最後に編集したユーザー non on 2013年7月03日(水) 17:07 [ 編集 1 回目 ]
non

M.R

Re: C言語のコードが読み解けないです。

#57

投稿記事 by M.R » 12年前

結果から予想するに
改行コードの違いではないでしょうか CR+LF、LF

双方のcsvデータをバイナリーエディタなどで開いて確認すれば違いが判るはずです。

閉鎖

“C言語何でも質問掲示板” へ戻る