専門家に聞いた!繰り返す痔の原因は!? >>

こんにちは。

C言語で「入力された文字列から名前順にソート」する場合、どのようにすればよろしいのでしょうか?
名前順にソートする考え方、コードを教えていただけませんか?
※qsortは使わない前提です。
私の中のイメージは「文字列[5]と文字列[4]を比較して、文字列[5]の頭文字が若い場合、交換する」といった具合なのですが、うまくコードに表すことができないです...。

ご教示お願いします><

質問者からの補足コメント

  • ご回答ありがとうございます。

    バブルソートという名前でしたね^^;

    この方法を用いた文字列の入れ替えの方法がわかりません。(そもそもバブルソートで文字列の入れ替えが可能かどうかもわかりません。)

    どのような考え方で文字列を名前順にソートできるのでしょうか...?

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/02/23 12:11

このQ&Aに関連する最新のQ&A

A 回答 (2件)

この回答への補足あり
    • good
    • 0

char 入力された文字列[10][80], *並べ替えバッファ[10], *p;


for (i=0; i<10; i++) 入力する(入力された文字列[i]);
for (i=0; i<10; i++) 並べ替えバッファ[i] = 入力された文字列[i];
/* 文字列[5]と文字列[4]を比較して、文字列[5]の頭文字が若い場合、交換する */
if (strcmp(並べ替えバッファ[4], 並べ替えバッファ[5]) > 0) {
p = 並べ替えバッファ[4];
並べ替えバッファ[4] = 並べ替えバッファ[5];
並べ替えバッファ[5] = p;
}
for (i=0; i<10; i++) 出力する(並べ替えバッファ[i]);
    • good
    • 0
この回答へのお礼

コードかけました!
strcmpの意味を勘違いしていました。。;

お礼日時:2015/02/24 11:54

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qアルファベットの並べ替え

C言語で文字を読み込んで並べ替えをしたいのですが、
void mojiSort(char *h[ ], int n){
int i, j;
char *temp;

for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (strcmp( h[j], h[i]) < 0) {
temp = h[i];
h[i] = h[j];
h[j] = temp;
}
}
}
return ;
}
とすると大文字、小文字を分けて並べ替えてしまいます。
「A」の後に「a]がくるようにするにはどうしたらよいでしょうか?

Aベストアンサー

比較をする際に、小文字ないし大文字に両者を統一したものを比較することによって回避できると思います。同じだった場合は大文字を先にすればいいと思います。

Q辞書順にソートしたいのですが・・・

C言語を始めたばかりの無知な自分で申し訳ないのですが学校で課題が出て分からなくて困っています。
課題は任意の長さの文字列(英字のみ)データをファイルから読み込み、辞書順に並べ替えるプログラムの作成です。文字列の最大長は64、データの最大個数は1000です。
一応自分で以下の状態まで作成したのですが、データが1000まで読み込んでくれません。申し訳ありませんが締め切りは明日なのでなるべく早くよろしくお願いします。
#include<stdio.h>
#include<string.h>
#include<strings.h>
#define MAX 67

int main(void)
{
FILE *fp;
char ex[1000][MAX],tmp[MAX],a[100];
int i,j,b;

printf("Input filename:");
scanf("%s",a);
fp = fopen(a,"r");
if(fp == NULL){
printf("Not open\n");
}

for(i=0;!feof(fp);i++){
fgets(ex[i],MAX,fp);
}

for(i=0;i<=MAX-2;i++){
for(j=i+1;j<=MAX-1;j++){
b = strcasecmp(ex[i],ex[j]);
if(b>0){
strcpy(tmp,ex[i]);
strcpy(ex[i],ex[j]);
strcpy(ex[j],tmp);
}
if(b==0 && *ex[i]<='z' && *ex[i]>='a' && *ex[j]<='Z' && *ex[j]>='A'){
strcpy(tmp,ex[i]);
strcpy(ex[i],ex[j]);
strcpy(ex[j],tmp);
}
}
}

for(i=0;i<=MAX-1;i++){
printf("%s",ex[i]);
}

fclose(fp);

return 0;
}

C言語を始めたばかりの無知な自分で申し訳ないのですが学校で課題が出て分からなくて困っています。
課題は任意の長さの文字列(英字のみ)データをファイルから読み込み、辞書順に並べ替えるプログラムの作成です。文字列の最大長は64、データの最大個数は1000です。
一応自分で以下の状態まで作成したのですが、データが1000まで読み込んでくれません。申し訳ありませんが締め切りは明日なのでなるべく早くよろしくお願いします。
#include<stdio.h>
#include<string.h>
#include<strings.h>
#define MAX ...続きを読む

Aベストアンサー

バージョンによるかもしれませんが。
BorlandCで strings.hとstrcasecmpはエラーになりませんか。存在しないようなので。
strcasecmpをstrcmpにして通しましたけど。

1 メモリモデルはラージにしておきましょう。
  char ex[E_sizeMax][E_subMax] が大きいです。

2 char ex[E_sizeMax][E_subMax]はmainの外に出した方がよいです。

3 printf("Not open\n");
  の下に exit()を追加しましょう。
  ファイルが無くてもそのまま進んでしまいますよ。

4 word_num の定義を忘れずに。
5 malloc はHelpを読みましょう。

#include<mem.h>
char *cp;
cp=malloc(E_sizeMax * E_subMax );//メモリ確保

if(cp!=NULL){
for(i=0; i<E_sizeMax; i+=E_subMax ){
cp[i] =i; //以下も同じ位置のアクセスです。
*(cp+i) =i;//どれもE_subMax 毎にiを書いています。
//ただし*cpはcharなのでintの下位8bitしか 書き込めませんが。
}
free(cp); //メモリ解放
}

PCのOS上で動かす場合と組み込みCPUでOSなしの場合などメモリ環境により変数の確保の仕方も変わりますのでそれに応じて考えなければなりません。

バージョンによるかもしれませんが。
BorlandCで strings.hとstrcasecmpはエラーになりませんか。存在しないようなので。
strcasecmpをstrcmpにして通しましたけど。

1 メモリモデルはラージにしておきましょう。
  char ex[E_sizeMax][E_subMax] が大きいです。

2 char ex[E_sizeMax][E_subMax]はmainの外に出した方がよいです。

3 printf("Not open\n");
  の下に exit()を追加しましょう。
  ファイルが無くてもそのまま進んでしまいますよ。

4 word_num の定義を忘れずに。
...続きを読む

QC言語:文字列の並び替え

3つの文字列を入力して、昇順に並び替えを行う方法教えて下さい。
例えば、
AKIRA
AKIKO
AIKOSANN と、入力されたら、

AIKOSANN
AKIKO
AKIRA   となるようにアルファベットが早い順に並びかえを行いたいのです。

わかる方、助けてください!

Aベストアンサー

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 256
#define MAX_LIST 3
int comp(const void *a, const void *b)
{
return strcmp( (const char*)a , (const char*)b ) ;
}
int main(){
char StringList[MAX_LIST][MAX_LEN];
int i;
for( i = 0 ; i < MAX_LIST ; i++ ){
fgets( StringList[i] , MAX_LEN , stdin );
}
qsort( StringList , MAX_LIST , sizeof(char) * MAX_LEN , comp);
printf("\n");
for( i = 0 ; i < MAX_LIST ; i++ ){
printf("%s",StringList[i]);
}
}

参考URL:http://www.doumo.jp/postgretips/tips.jsp?tips=46

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 256
#define MAX_LIST 3
int comp(const void *a, const void *b)
{
return strcmp( (const char*)a , (const char*)b ) ;
}
int main(){
char StringList[MAX_LIST][MAX_LEN];
int i;
for( i = 0 ; i < MAX_LIST ; i++ ){
fgets( StringList[i] , MAX_LEN , stdin );
}
qsort( StringList , MAX_LIST , sizeof(char) * MAX_LEN , comp);
printf("\n");
for( i = 0 ; i < MAX_LIST ; i++ ){
printf("%s",StringLis...続きを読む

Q漢字のソートについて

住所録ソフトを作っています。

名字を漢字のままあいうえお順にソートしたいのですが、
常套手段があるのでしょうか?

Aベストアンサー

> strcmpだとどうしてまったく並び変わらないのでしょう?

strcmp の場合でも,まったく並び変わらないということはないと思うのですが。
状況がよく分からないのでとりあえず,
実験用に作ったコードと実行結果を載せときます。
試してみてください。

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

int comp(const void *x, const void *y)
{
// return _mbscmp(*(unsigned char**)x, *(unsigned char**)y);
 return strcmp(*(char**)x, *(char**)y);
}

int main(int argc, char* argv[])
{
 char *list[] = {
  "東京", "大阪", "神奈川", "愛知", "埼玉",
 };
 const int n = sizeof(list) / sizeof(list[0]);

 /* ソート */
 qsort(list, n, sizeof(list[0]), comp);

 /* 表示 */
 for (int i=0 ; i<n ; i++) {
  puts(list[i]);
 }
 return 0;
}

/* 実行結果 */
愛知
埼玉
神奈川
大阪
東京

/* 環境 */
Windows 2000 SP4, VC++ 6.0 SP5

> IMEの入力時に読みを取ることをVC++で実現するにはどうすれば良いのでしょうね?

や,だから #6 で示した URL に,
http://www.geocities.co.jp/SiliconValley-Oakland/1865/visualc/NoryImm.html
すぐに動かせるサンプルがあるのにぃ。

参考URL:http://www.geocities.co.jp/SiliconValley-Oakland/1865/visualc/NoryImm.html

> strcmpだとどうしてまったく並び変わらないのでしょう?

strcmp の場合でも,まったく並び変わらないということはないと思うのですが。
状況がよく分からないのでとりあえず,
実験用に作ったコードと実行結果を載せときます。
試してみてください。

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

int comp(const void *x, const void *y)
{
// return _mbscmp(*(unsigned char**)x, *(unsigned char**)y);
 return strcmp(*(char**)x, *(char**)y);
...続きを読む

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む

Qリスト構造のソートで悩んでます。。。

リスト構造のソートで悩んでます。プログラムの内容はファイルからデータをリスト構造の構造体に読み込み、名前順にソートし結果を表示する。というものです。データの追加や削除はできるのですがソートとなると頭が混乱してしまいお手上げ状態になってしまいました。。。。。
読み込み用のデータとプログラムソースを以下に記載するのでどなたか良きアドバイスをお願いしますm(_ _)m

○データ

Sakuragi
16
Rukawa
16
Miyagi
17
Akagi
18
Mitsui
18

○ソース
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MENBER 5

typedef struct data{
char name[BUFSIZ];
int age;
struct data *next;
}LIST;

LIST *newLIST(void);
LIST *sort(LIST *);

int main(int argc,char *argv[]){

FILE *fp;
LIST *p;
LIST *np;
LIST *npb;
LIST *head;

char namae[BUFSIZ];
int toshi,i;

if((fp=fopen(argv[1],"r"))==NULL){
printf("no file\n");
exit(1);
}

head = newLIST();
npb =head;

for(i=0;i<MENBER;i++){
np = newLIST();
fscanf(fp,"%s %d",namae,&toshi);
strcpy(np->name,namae);
np->age = toshi;

npb->next =np;
npb = np;
}

sort(head);

for(p=head->next;p != NULL;p=p->next){
printf("%s\t%d\n",p->name,p->age);
}

for(p=head->next;p != NULL;p=np){
np = p->next;
free(p);
}

fclose(fp);
return(0);
}

LIST *newLIST(){
LIST *p;
p = (LIST *)malloc(sizeof(LIST));
p->next = NULL;
return(p);
}

LIST *sort(LIST *head){
}

リスト構造のソートで悩んでます。プログラムの内容はファイルからデータをリスト構造の構造体に読み込み、名前順にソートし結果を表示する。というものです。データの追加や削除はできるのですがソートとなると頭が混乱してしまいお手上げ状態になってしまいました。。。。。
読み込み用のデータとプログラムソースを以下に記載するのでどなたか良きアドバイスをお願いしますm(_ _)m

○データ

Sakuragi
16
Rukawa
16
Miyagi
17
Akagi
18
Mitsui
18

○ソース
#include <stdio.h>
#include <std...続きを読む

Aベストアンサー

ソートするには「リストの順を入れ替える」か「リストの順は変えずにデータを入れ替える」と言う処理が必要です。

第1案 リストの順を入れ替える

リストの順を入れ替えるには、各項目のnextメンバを入れ替えます。

例えば
A→B→C→D→E
の状態でBとDを入れ替えるには
「Bを指す、A->next」と「Dを指すC->next」を入れ替え
「Bの次を指す、B->next」と「Dの次を指す、D->next」を入れ替え
と言う2つの「入れ替え」を行わなければなりません。

「B」を参照している時に「Bを指す、A->next」を知るには「Bの前は何か?」を知る必要があります。

リストの項目が少ないならば、先頭から順にサーチしていけば良いですが、項目が増えればサーチに時間が掛かり、現実的ではありません。

また、nextメンバの入れ替えが煩雑になり、あまり適切とは言えません。

第2案 データの実体を入れ替える

入れ替えの際にnextメンバを変更せず、nameメンバの内容、ageメンバの内容を入れ替えます。

この場合、ソート後に一番末尾になる項目が先頭にある、と言う場合、データの実体の入れ替えが何回も発生します。

もし「データの実体サイズ」が大きいと、メモリアクセスが膨大に発生し、実用にならない速度になります。

第3案 リストの順、データの実体は入れ替えず、リストからデータへの参照のみ入れ替える。

データ構造体とリスト構造体を分離します。

typedef struct data_t {
char name[BUFSIZ];
int age;
} DATA;

typedef struct list_t {
DATA *data;
LIST *next;
} LIST;

void swapLIST(LIST *p1,LIST *p2)
{
DATA *tp;
tp = p1->data;
p1->data = p2->data;
p2->data = p1->tp;
}

LIST *newLIST(){
LIST *lp;
DATA *dp;
lp = (LIST *)malloc(sizeof(LIST));
if(lp==NULL) return(NULL);
dp = (DATA *)malloc(sizeof(DATA));
if(dp==NULL) {free(lp); return(NULL);}
lp->data = dp;
lp->next = NULL;
return(lp);
}

void sort(LIST *top){
LIST *p1;
LSTT *p2;
for(p1=top;p1->next!=NULL;p1=p1->next){
for(p2=p1->next;p2!=NULL;p2=p2->next){
if(strcmp(p1->data->name,p2->data->name) > 0) swapLIST(p1,p2);
}
}
}

int main(int argc,char *argv[]){

FILE *fp;
LIST *p;
LIST *np;
LIST *head;

char namae[BUFSIZ];
int toshi,i;

if((fp=fopen(argv[1],"r"))==NULL){
printf("no file\n");
exit(1);
}

head = NULL;
np = NULL;

for(i=0;i<MENBER;i++){
p = newLIST();
if(p==NULL) break;/*メモリ不足*/
if(head==NULL) head=p;/*最初の1個目*/
if(np!=NULL) np->next =p;/*1つ前があるなら、1つ前のnextをpに繋げる*/
fscanf(fp,"%s %d",namae,&toshi);
strcpy(p->data->name,namae);
p->data->age = toshi;
np=p;
}

sort(head);

for(p=head;p != NULL;p=p->next){
printf("%s\t%d\n",p->data->name,p->data->age);
}

for(p=head;p != NULL;p=np){
free(p->data);
np = p->next;
free(p);
}

スワップ・ソートを行う場合、2つのリストのdataメンバのみ入れ替えれば良いので、かなり処理が軽く、この方法が一番現実的です。

なお、最初に確保するデータが無駄になっているので改良してあります。

ソートするには「リストの順を入れ替える」か「リストの順は変えずにデータを入れ替える」と言う処理が必要です。

第1案 リストの順を入れ替える

リストの順を入れ替えるには、各項目のnextメンバを入れ替えます。

例えば
A→B→C→D→E
の状態でBとDを入れ替えるには
「Bを指す、A->next」と「Dを指すC->next」を入れ替え
「Bの次を指す、B->next」と「Dの次を指す、D->next」を入れ替え
と言う2つの「入れ替え」を行わなければなりません。

「B」を参照している時に「Bを指す...続きを読む

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Qファイルの中身検索と表示

Cでの作成についてなんですが、
fopenでテキストファイルを開き、テキストの中身の
特定文字が含まれている行を新に作ったファイルの中に
書き込みたいんですが、テキストの中身の検索と
抽出方法がいろいろ試してみましたがわかりません。
よろしくお願いします。

Aベストアンサー

★文字列の検索関数を使えば良い。
・テキストの中身の検索は、行単位で文字列を取得(fgets)してから、この文字列内に
 検索文字列の有無をチェックします。この有無は文字列から文字列を検索する関数
 『strstr』関数を使うのが便利です。また、文字列から1文字の検索を行う場合は
 『strchr』関数を使います。質問では、特定の文字が含まれている行となっていますが
・検索するのは1文字、文字群、文字列のどれですか?
 これによっていろいろと代わりますよ。処理が…。
・とりあえず文字列から特定の文字列を含まれた行を抽出するサンプルを下に載せます。

サンプル:
char buff[ 256 ];
char *find = "検索文字列";
FILE *fp; ←読み込み用
FILE *fo; ←抽出用

省略(fopen×2つ)

while ( fgets(buff,sizeof(buff),fp) != NULL ){
 if ( strstr(buff,find) != NULL ){
  fputs( buff, fo );
 }
}

省略(fclose×2つ)

解説:
・上記のサンプルでは、行単位でテキストの中身を取得して、この文字列から検索文字列(find)が
 含まれるか『strstr()』関数でチェックしています。見つかると『NULL』以外を返します。
・そして、見つかったらば行単位で『fputs』関数で出力しています。
 これで見つかった行だけが、新たに作ったファイルに書き込まれていきます。→抽出です。
・また『strstr()』関数の部分を
 『if ( strchr(buff,'a') != NULL ){ … }』とすると『a』の文字が含まれる行のみを抽出します。
 『if ( strspn(buff,"+-*/") != 0 ){ … }』とすると『+-*/』の文字群が含まれる行のみを抽出します。
 検索する文字とは、1文字、文字群、文字列のどれですか?
・以上。おわり。→上記のを参考にして下さい。

参考URL:http://www9.plala.or.jp/sgwr-t/lib/strspn.html,http://www9.plala.or.jp/sgwr-t/c/sec17.html

★文字列の検索関数を使えば良い。
・テキストの中身の検索は、行単位で文字列を取得(fgets)してから、この文字列内に
 検索文字列の有無をチェックします。この有無は文字列から文字列を検索する関数
 『strstr』関数を使うのが便利です。また、文字列から1文字の検索を行う場合は
 『strchr』関数を使います。質問では、特定の文字が含まれている行となっていますが
・検索するのは1文字、文字群、文字列のどれですか?
 これによっていろいろと代わりますよ。処理が…。
・とりあえず文字列から特定...続きを読む

Qファイルから読み込んだデータを構造体に格納できますか?

1レコード19バイトのファイルを
読み込む処理を行っています。

地区名10バイト
県名8バイト
改行1バイト

このデータをdouken(構造体)に格納したいのですが
>while (fgets(dou,19,fp) != NULL){
で、エラーになってしまいます。

どのようにしたら
ファイルから読み込んだデータを
構造体に格納できますか?


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

struct douken {
char tiku[10];
char ken[8];
}

main(void){

FILE *fp;
struct douken dou[100];
int i;

fp = fopen("ex3.fil","rb");

if ( fp == 0 ){
printf("can't open\n");
exit(1);
}

while (fgets(dou,19,fp) != NULL){



1レコード19バイトのファイルを
読み込む処理を行っています。

地区名10バイト
県名8バイト
改行1バイト

このデータをdouken(構造体)に格納したいのですが
>while (fgets(dou,19,fp) != NULL){
で、エラーになってしまいます。

どのようにしたら
ファイルから読み込んだデータを
構造体に格納できますか?


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

struct douken {
char tiku[10];
char ken[8];
}

main(void){

FILE *fp;
struct douken dou[100];
int i;

...続きを読む

Aベストアンサー

>>while (fgets(buffer,20,fp) != NULL){
>と、するということですか?
>その場合、
>ここのサイズは必ず4の倍数になるということですよね?
構造体を直接扱うと、アーキテクスチャやコンパイラ依存してしまいます。
32bit機なら4byteですし、16bit機なら2byte。64bit機なら8byteです。
また、コンパイラの設定によってもどのように確保されるかまったく分からないのです。
一度バッファに蓄えてからmemcpyでコピーする方が安全ですし、可搬性があります。
C言語では\0を文字列の終端文字として使用しているので、10文字格納したいなら11byte確保する必要もあります。
簡単に修正してみました。

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

typedef struct douken_ {
char tiku[11];
char ken[9];
} douken;

int main(void){
FILE *fp;
douken dou [100];
char buff [18 /* douken */ + 1 /* LF(\n) */ + 1 /* \0 */];
int i;
i = 0;

fp = fopen("ex3.fil","rb");

if ( fp == 0 ){
printf("can't open\n");
exit(1);
}

// douを\0で埋める
memset (dou , '\0' , sizeof dou);

// 一度バッファに格納
while (fgets(buff,sizeof buff,fp) != NULL){
// memcpy関数でコピー
memcpy(&dou[i],buff,10);
memcpy(&dou[i],buff+10,8);

// 構造体配列より大きなファイルを開いたときの配慮
if (i == 99) break;
i++;
}

return 0;
}

>>while (fgets(buffer,20,fp) != NULL){
>と、するということですか?
>その場合、
>ここのサイズは必ず4の倍数になるということですよね?
構造体を直接扱うと、アーキテクスチャやコンパイラ依存してしまいます。
32bit機なら4byteですし、16bit機なら2byte。64bit機なら8byteです。
また、コンパイラの設定によってもどのように確保されるかまったく分からないのです。
一度バッファに蓄えてからmemcpyでコピーする方が安全ですし、可搬性があります。
C言語では\0を文字列の終端文字として使用して...続きを読む

Qfgetsなどのときのstdinのバッファを消すには?

こんにちは,今C(C++でない)を使用しています。
たとえば,
char str[20]
fgets(str,sizeof(str),stdin)
としたときに20字以上を打つと,stdinのバッファに20字以上の分が残ったままになります。

C++などでは
fflush(stdin)で,うまくいきますが,普通のCでは対応がされていないみたいでうまくいきません。

よろしくお願いします。

Aベストアンサー

あ,テキスト入力だからこんな大掛かりなことしなくてもいいんだ.
末尾に'\n'が出るまで掃出せばいいんですよね.

fgets(str, sizeof(str), stdin);
if ( str[strlen(str)-1] != '\n' ){
while( getchar() != '\n' );
}

でいいんだ.失礼しました.


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング