• 締切済み

文字入れ替え

#include "stdafx.h" #include <ctype.h> #include <string.h> #include <stdlib.h> typedef struct { char number[6]; char class_type[20]; char name[8]; char subject[5]; } my; my data[100]; int main(int argc, char* argv[]) { FILE *fp; int field = 0, line = 0; char buf[1000], *str; char bufG[1111]; int i; if((fp=fopen("test3.csv","r"))==NULL){ printf("ファイルが開けません"); } while(fgets(buf,1000,fp) !=NULL){ str=buf; while(*str != '\0'){ if(*str != ','){ for(i = 0; *str != ',' && *str != '\0' ; i++){ if(*str == '\n'){ } else{ bufG[i] = *str; } str++; } bufG[i] = '\0'; switch(field){ case 0: strcpy(data[line].number, bufG); break; case 1: strcpy(data[line].class_type, bufG); break; case 2: strcpy(data[line].name, bufG); break; case 3: strcpy(data[line].subject, bufG); break; } field++; } else{ str++; } } line++; field = 0; } int p, q; for(p = 0; p < line; p++){ for(q = 0; q < line; q++){ if(strcmp(data[p].class_type, data[q].class_type) == 0 && strcmp(data[p].subject, data[q].subject) == 0 && p != q ){ printf("p=%d q=%d\n", p, q); } } } fclose(fp); return 0; } こちらのプログラムは 1,A,山根,音楽//番号、クラス、名前、好きな教科 2,B,本田,美術 3,B,松本,美術 4,A,横野,音楽 というファイルの内容を読み込んでクラスと好きな教科が同じものを 1,A,山根、音楽 4,A,横野、音楽 2,B,本田、美術 3,B,松本、美術のようにソートするプログラムの続きですが ソート方法についてです。 if(strcmp(data[p].class_type, data[q].class_type) == 0 && strcmp(data[p].subject, data[q].subject) == 0 && p != q ){ swap(data[p+1].number, data[q].number; swap(data[p+1].class_type, data[q].class.type); swap(data[p+1].name,data[q].name); swap(data[p+1].subject,data[q].subject); } void swap(char *p, char *q) { char *temp; temp = p; p = q; q= temp; } のように追加してみましたが入れ替えができていません。 どこがまずいのでしょうか?又他にも良い方法があれば教えて下さい。

みんなの回答

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.2

#1の方と同意です。 構造体の各メンバにstrcpyで文字列コピーしてるのに swapの中ではstrcpyを使っていないのがダメですね。 単純にアドレスをコピーしてるだけで終わっているのです。 あと懸念するところ ・my data[100];と宣言してますが100件以上越えたらどうするんでしょう? ・','区切りで取り出すのなら、strtok関数を使いましょう。 ・普通にstrcpy使ってますが、それぞれの項目で文字列の長さが固定なのが気になりますね。

  • prophetok
  • ベストアンサー率44% (13/29)
回答No.1

void swap(char *p, char *q) { char *temp; temp = p; p = q; q= temp; } これじゃ何の作用も起こさない。 ポインタ、文字列の扱いが全く理解できていないようなので、基礎から勉強し直しましょう。

関連するQ&A