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

以下はsample.txtというファイルを読み込み、辞書順に並べるプログラミングですが、どう正しく
直したらよいかわかりません。間違っている場所を指摘していただけたらと思います。
(間違えだらけで申し訳ありません)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXLINE 500

void mysort(char *word[MAXLINE])
{ int i,j;
char *tmp;

for(i=0;;i++){
for(j=i+1;; j++){
if(strcmp(word[j],word[i])==1){
tmp=word[i]; word[i]=word[j];
word[j]=tmp;

}
}

}
}
int main(void)
{ int i;
FILE *fp;
char str[MAXLINE];

fp= fopen("sample.txt", "r");
if (fp == NULL) {
printf("fopen error\n");
exit(1);
}
while(( fgets( str, MAXLINE, fp )) != NULL)

mysort(str);
for(i=0;; i++) printf("%s\n", str[i]);

return 0;
}

A 回答 (3件)

「どう正しく直したらよいかわかりません」ということは, あなたはこのプログラムが「間違っている」と思ったわけですね.



いかなる理由で「間違っている」と思ったのですか?

この回答への補足

実際に実行してみたら、エラーが出てしまったからです。

補足日時:2012/01/16 17:06
    • good
    • 0

ソート以前にいろいろおかしな所があります



> for(i=0;;i++){
> for(j=i+1;; j++){

ループに終了条件がないように見えます。というか全部無限ループ

> if(strcmp(word[j],word[i])==1){

strcmp() の仕様を良く読んでください。==0, >0,<0 とは書いてあると思いますが、どこにも1とは書いてないと思います。まあ、名前が同じだけで自作したライブラリならかまいませんが。

> while(( fgets( str, MAXLINE, fp )) != NULL)
> mysort(str);

これ1行 str に読むたびに mysort() 呼び出してますが、意図してますか?

> for(i=0;; i++) printf("%s\n", str[i]);

str[i] は char 型で %s に一致しませんし、この時点で str には sample.txt の最終行しか残ってません

> void mysort(char *word[MAXLINE])

一致しないと言えば mysort() も一致してませんね。ここから想像するに
> char str[MAXLINE];
が sample.txt の行数分必要そうな感じがしますが、さて?
    • good
    • 0

sample.txt 内のある一行に次のような文字列が記録されていた場合,


simaku
これをアルファベットの昇順に並べて次のような文字列にしたいということでしょうか。
aikmsu
正しく動作するか否かは不問にしても,質問文のmysort()でやろうとしていることはそういうことですよね。

もしかして,質問者のしたいことというのが,
一行中の0文字目,1文字目,2文字目,3文字目……を並べ替えるのではなく,
一行中の文字列の並びはいっさい変えずに0行目,1行目,2行目,3行目……を並べ替え対象としたいのなら,
このような小さなサンプルプログラムにおいては "sample.txt" の全行を配列にため込むのが常套だと思います。

整列をどうするかは保留するとして,全行を配列にため込むというのはこんな風なコードのことです。

#include <stdio.h>

#define MAXLINE 500
#define MAXLENGTH 80

int main(void) {
int i;
FILE *fp;
char str[MAXLINE][MAXLENGTH];

fp = fopen("sample.txt", "r");
if (fp == NULL) {
printf("fopen error\n");
exit(1);
}

i = 0;
while (fgets(str[i], MAXLENGTH, fp) != NULL) {
i++;
}
int totallines = i;

for (i = 0; i < totallines; i++) {
printf("%s", str[i]);
}

return 0;
}
    • good
    • 0

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