ショッピングモール  Automotive / Motorcycles ( History )


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.5318

ループについて質問ですが
投稿者---新入社員(2006/01/23 16:01:50)


getsで入力した氏名と構造体配列の中身の氏名を全て比べて
全て一致しなければprintfで見つからなかった事を表すループを作りたくて、
とりあえず作ってみたのですがコンパイルは通るのですが全く上手くいきません。
改善点等アドバイスお願いしたいのですが・・・

<pre>int z,k;
char name2[32];

z = 0;

if( z &lt;= k ){
if( strcmp( name2 , data[z].name )!= 0 ){
z++;
}
else{
break;
}
}

if( z == k &amp;&amp; strcmp( name2 , data[z].name ) != 0 ){
printf( &quot;指定の氏名%sは見つかりませんでした\n&quot; , name2 );
break;
}


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ループについて質問ですが 5319 とろり 2006/01/23 16:17:08
<子記事> Re:ループについて質問ですが 5320 あかま 2006/01/23 16:29:24
<子記事> Re:ループについて質問ですが 5322 円零 2006/01/23 16:38:56
<子記事> Re:ループについて質問ですが 5329 nop 2006/01/23 18:39:05


No.5319

Re:ループについて質問ですが
投稿者---とろり(2006/01/23 16:17:08)


こんにちは。

>とりあえず作ってみたのですがコンパイルは通るのですが全く上手くいきません。
>改善点等アドバイスお願いしたいのですが・・・

ソースの貼り付けに失敗しています。再投稿願います。
また、以下についても追記願います。

・環境
・どのように上手くいかないか。
⇒この場合、入力情報と、期待する出力情報 および 現在の出力情報 などです。


この投稿にコメントする

削除パスワード

No.5324

Re:ループについて質問ですが
投稿者---新入社員(2006/01/23 16:39:30)


>

申し訳ございません。
ループ箇所を含め再度、投稿します。
私がコメント化した箇所が何らかの失敗で上手くいきません。
name2にファイルに書き込まれてない氏名を入力しても先に進んでしまいます。

while( 1 ){

printf( "削除する氏名を入力=> ");
/* gets(name2); */
scanf( "%s" , name2 );
if( strcmp( name2 , "end" ) == 0 )
break;

k = 0;

while( fgets( buf, sizeof(buf), fp ) != NULL ){
for( i = 0; i < buf[i] != '\0'; i++ ){
if( strncmp( &buf[i] , "\t" , 1 )==0 ){
strncpy( data[k].name , buf , i );
data[k].score = atoi( &buf[i+1] );
k = k + 1;
}
}
}

/* ここから */
z = 0;
if( z <= k ){
if( strcmp( name2 , data[z].name )!= 0 ){
z++;
}
else{
break;
}
}

if( z == k && strcmp( name2 , data[z].name ) != 0 ){
printf( "指定の氏名%sは見つかりませんでした\n" , name2 );
break;
}

/* ここまで */


for( t = 0; t <= k; t++ ){
if( strcmp( name2 ,data[t].name ) == 0 ){
printf( "%sを削除しました\n" , name2 );
fclose(fp);
v = t;

fp = fopen( "seiseki3.txt" , "w+" );

if(fp == NULL){
printf("seiseki3.txt使用不可\n");
}

for( v; v <= k; v++ ){
strcpy( data[v].name , data[v+1].name );
data[v].score = data[v+1].score;
}

for( m = 1; m <= k-1; m++ ){
fprintf( fp, "%s%c%d\n", data[m-1].name, '\t', data[m-1].score );
}
}
}

}

fclose(fp);

}


この投稿にコメントする

削除パスワード

No.5328

Re:ループについて質問ですが
投稿者---とろり(2006/01/23 18:19:30)


ごめんなさい。
体調悪くて、ソース読む気になれません && 適切な助言も考えられません。

(あおった(?)責任もあるかもと思ったので)ちゃっちゃとサンプル作りました。
適当に照らし合わせてください。

#改行処理していないとかgets()使っていないとか細かいとこは無視してます。。。
#他の回答者の皆様あとよろしくお願いします。もうだめ。。。


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

struct Data{
    char name[32];
    char tel[16];
} Data;

int main(void)
{
    int i;
    char *token;
    char rbuf[128];
    char name[32];
    FILE *fp;

    struct Data data[32];
    int datanum;

    fp = fopen("data.txt", "r");
    if (fp == NULL) {
        printf("file open error.\n");
        exit(1);
    }
    i = 0;
    memset(data, 0x00, sizeof(data));
    while (NULL != fgets(rbuf, sizeof(rbuf), fp)) {
        token = strtok(rbuf, ",");
        strcpy(data[i].name, token);
        token = strtok(NULL, ",");
        strcpy(data[i].tel, token);
        i++;
    }
    datanum = i;
    fclose(fp);

    while (1) {
        printf("input name.(end=end) -->");
        scanf("%s", name);
        if (0 == strcmp(name, "end")) {
            break;
        }

        for (i = 0; i < datanum; i++) {
            if (0 == strcmp(name, data[i].name)) {
                break;
            }
        }
        if (i == datanum)
            printf("データなし\n");
        else
            printf("name:%s\ntel:%s\n", data[i].name, data[i].tel);
    }

    return 0;
}


[入力データ]
aaaaa,111-1111-1111
bbbbb,222-2222-2222
ccccc,333-3333-3333
ddddd,444-4444-4444
eeeee,555-5555-5555
fffff,666-6666-6666
ggggg,777-7777-7777
hhhhh,888-8888-8888


[実行結果]
input name.(end=end) -->ccccc
name:ccccc
tel:333-3333-3333

input name.(end=end) -->iiiii
データなし
input name.(end=end) -->end
Press any key to continue


この投稿にコメントする

削除パスワード

No.5320

Re:ループについて質問ですが
投稿者---あかま(2006/01/23 16:29:24)


プログラムはできれば全体を貼るといいです。
大きすぎるときは、関係ありそうな関数一つ丸ごととか何らかの単位で。
この質問の場合は構造体の定義なども含めるとよいです。

>getsで入力した氏名と構造体配列の中身の氏名を全て比べて
>全て一致しなければprintfで見つからなかった事を表すループを作りたくて、
貼られたプログラムにはループがないようですよ?
たぶん↓のような感じになります。

int i;
for(i=0;i < データ数;i++){
    if(strcmp(name2,data[i].name)==0) break;
}
if(i == データ数) printf("みつからね");






この投稿にコメントする

削除パスワード

No.5322

Re:ループについて質問ですが
投稿者---円零(2006/01/23 16:38:56)


そりゃあなた、forもwhileも、はたまたgotoもないんだからループなんてしないでしょう。


この投稿にコメントする

削除パスワード

No.5329

Re:ループについて質問ですが
投稿者---nop(2006/01/23 18:39:05)


>とりあえず作ってみたのですがコンパイルは通るのですが全く上手くいきません。
>改善点等アドバイスお願いしたいのですが・・・

何故、「下記関数における問題点について」で指摘された点を反省しないのでしょうか?


[No.5272 投稿者---Blue]
> > コンパイルすると上手く動かない
> がイマイチよくわからないので、もう少し現象を詳しく説明してください。

[No.5273 投稿者---nop]
> 1.どの様に動作する事が正しいのか?
> 2.現在、どの様な動作をするのか?
> 3.自分でどこまで調査したのか?
> 4.疑問点はどこか?
> これらの情報が不足しています。

[No.5275 投稿者---επιστημη]
> >scanfではなくgetsを使いたいがそうするとうまく動かない。
> なにがどう「うまく動かない」か説明を求む。
> # 「具合が悪い」の一言で治療できる医者はいない。
> # …"お約束"のフレーズになってきたな (^^

これらの指摘は全て流すのですか?


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity