掲示板ランキング  その他テニス  ロッド・竿  リール  ルアー  ウェア  バッグ・ケース  小物


掲示板利用宣言

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

 私は

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

掲示板1

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

No.7076

リンクトリストへの配列の格納
投稿者---蒼(2007/02/07 11:16:51)


こんにちは。
今、キーボードから入力した「数」を、順番に配列に格納し、
すべて入力し終わったら表示するプログラムを作成しています。
以下のように自分で作成してみたのですが、結果は

Input kazu -> 5
Input kazu -> 8
Input kazu -> 7
Input kazu -> owari



のように、配列がコピーされていません。
何処かまずいところがあるのでしょうか。
教えて下さい、お願いします。


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

#define BUFSIZE 100
#define KAZUSIZE 100

struct CELL {
  int kazu[KAZUSIZE];
  struct CELL *next;
};

int main(void)
{
  char buf[BUFSIZE];
  int k[KAZUSIZE];
  int i;
  struct CELL *head, *tail;
  struct CELL *tmpc;

  head = NULL;
  tail = NULL;

  while(1) {
    printf("Input kazu -> ");
    fgets(buf, BUFSIZE, stdin);
    buf[strlen(buf)- 1] = '\0';
    if (strcmp(buf, "owari") == 0) {
      break;
    }

     k[KAZUSIZE] = atoi(buf);

    for(i = 0; i != '\0'; i++) {
      kazu[i] = k[i];
      }
    
    tmpc = (struct CELL *)malloc(sizeof(struct CELL));
    if (tmpc == NULL) {
      printf("memory allocation error!!\n");
      exit(EXIT_FAILURE);
    }

    if(head == NULL) {
      head = tmpc;
    } else {
      tail->next = tmpc;
    }
    tail = tmpc;
    tail ->next = NULL;
  }

  for (tmpc = head; tmpc!= NULL; tmpc = tmpc->next) {
    printf("%s\n", tmpc->kazu);
  }
}



環境は、OSがウィンドウズXP、コンパイラはBorland C++です。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:リンクトリストへの配列の格納 7078 sticky-bit 2007/02/07 11:26:42
<子記事> Re:リンクトリストへの配列の格納 7086 RiSK 2007/02/08 16:07:47
<子記事> Re:リンクトリストへの配列の格納 7106 2007/02/14 09:27:49
<子記事> Re:リンクトリストへの配列の格納 7110 ルナレルナ 2007/02/15 15:08:46
<子記事> Re:リンクトリストへの配列の格納 7170 2007/02/25 12:19:42


No.7078

Re:リンクトリストへの配列の格納
投稿者---sticky-bit(2007/02/07 11:26:42)


アップロードされたソースコードをそのままコンパイルしたところ、
下記のエラーと警告が出ました。
まずは、これらを修正してください。


エラー E2451 C:\TEMP\temp3\temp3.c 35: 未定義のシンボル kazu(関数 main )
警告 W8070 C:\TEMP\temp3\temp3.c 56: 関数は値を返すべき(関数 main )



この投稿にコメントする

削除パスワード

No.7086

Re:リンクトリストへの配列の格納
投稿者---RiSK(2007/02/08 16:07:47)


>何処かまずいところがあるのでしょうか。

> int k[KAZUSIZE];
> k[KAZUSIZE] = atoi(buf);

なぜこうしたのですか?説明して欲しいです。


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void){
    char a[256];
    struct a{int a;struct a*b;}*b=0,*c=0,*d;
    for(;printf("Input kazu -> "),scanf("%255s",a)==1&&strcmp(a,"owari");c=d){
        if (!(d=malloc(sizeof(struct a))))printf("memory allocation error!!\n"),exit(1);
        d->a=atoi(a),d->b=0;
        if(!b)b=d;else c->b=d;
    }
    for (d=b;d;d=d->b)printf("%d\n",d->a);
}



この投稿にコメントする

削除パスワード

No.7106

Re:リンクトリストへの配列の格納
投稿者---蒼(2007/02/14 09:27:49)


返信が遅くなり、申し訳ありません。

以下のようにしたらエラーは出ませんでした。

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

#define BUFSIZE 100
#define KAZUSIZE 100

struct CELL {
  int kazu[KAZUSIZE];
  struct CELL *next;
};

int main(void)
{
  char buf[BUFSIZE];
  struct CELL *head, *tail;
  struct CELL *tmpc;
  int i, j;

  head = NULL;
  tail = NULL;

  while(1) {
    printf("Input kazu -> ");
    fgets(buf, BUFSIZE, stdin);
    buf[strlen(buf)- 1] = '\0';
    if (strcmp(buf, "owari") == 0) {
      break;
    }
    
    i = atoi(buf);
    for(j = 0; j != '\0'; j++) {
      tmpc->kazu[j] = i;
}
    
    tmpc = (struct CELL *)malloc(sizeof(struct CELL));
    if (tmpc == NULL) {
      printf("memory allocation error!!\n");
      exit(EXIT_FAILURE);
    }

    if(head == NULL) {
      head = tmpc;
    } else {
      tail->next = tmpc;
    }
    tail = tmpc;
    tail ->next = NULL;
  }

  for (tmpc = head; tmpc!= NULL; tmpc = tmpc->next) {
    printf("%s\n", tmpc->kazu);
  }
}



修正前のようにしたのは、int kazuをメインにいれないと、
コンパイルの時、エラーが出てしまったからです。


この投稿にコメントする

削除パスワード

No.7107

Re:リンクトリストへの配列の格納
投稿者---jazz(2007/02/14 09:56:48)


>以下のようにしたらエラーは出ませんでした。

投稿されたコードを、そのままBorland C++ Compilerでコンパイルしたところ、
下記の2つの警告が出ました。

警告 W8013 C:\TEMP\temp1\temp1.c 33: 'tmpc' は、おそらく値が代入される前に使われている(関数 main )
警告 W8070 C:\TEMP\temp1\temp1.c 54: 関数は値を返すべき(関数 main )

後の方はコードの最後で
    return 0;
と書けばすみます。しかし、1つ目の警告は問題ありです。

>    for(j = 0; j != '\0'; j++) {
>      tmpc->kazu[j] = i;
>}

tmpcがどこを指しているかわからない状態で、tmpcが指している領域に
値をセットすると、まずいことが起きます。
現に、実行結果は正しくありません。ご自分で実行して確認しましたか?

また、上に引用したfor文で、jが'\0'でない間繰り返すとありますが、
意味合いがよくわかりません。さらに、

>  for (tmpc = head; tmpc!= NULL; tmpc = tmpc->next) {
>    printf("%s\n", tmpc->kazu);
>  }

tmpc->kazuという、配列の先頭要素へのポインタを
%sで出力している意味もわかりません。

今一度確認なさる方がよいと思います。




この投稿にコメントする

削除パスワード

No.7108

Re:リンクトリストへの配列の格納
投稿者---RiSK(2007/02/14 15:26:29)


もう一度聞きます。

> int k[KAZUSIZE];

なぜ,こうしたのですか?

あなたが使いたいデータ構造は何ですか?

1. int型の配列ですか?
2. 内部にint型を持つ(単方向)リストですか?
3. 内部にint型の配列を持つ(単方向)リストですか?

現在,あなたのコードは 3. ですよね?
私にはそうしている理由が分かりません。
ここに書かれていない問題文があるのでしょうか?

私は(得られている情報から) 2. を使えばいいのではないかと判断して
以前のコードを書いています。


この投稿にコメントする

削除パスワード

No.7110

Re:リンクトリストへの配列の格納
投稿者---ルナレルナ(2007/02/15 15:08:46)
http://park6.wakwak.com/~nougaki/mini_program/


//
//	リンクリストの前に……
//

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

#define BUFSIZE 100
#define KAZUSIZE 100

int main(void)
{
    int kazu[KAZUSIZE];
    int i, n;
    char buf[BUFSIZE];

    for (i = 0; i < KAZUSIZE; i++) {
        printf("Input kazu -> ");
        fgets(buf, BUFSIZE, stdin);
        
        buf[strlen(buf) - 1] = '\0';
        if (strcmp(buf, "owari") == 0)
            break;

        kazu[i] = atoi(buf);
    }
    
    n = i;
    for (i = 0; i < n; i++)
        printf("%d\n", kazu[i]);
        
    return 0;
}



この投稿にコメントする

削除パスワード

No.7170

Re:リンクトリストへの配列の格納
投稿者---蒼(2007/02/25 12:19:42)


また返信が遅くなってしまい申し訳ありません。
皆さんに頂いたアドバイスをもとに、
以下のような形で動くようになりました。


     #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        
        #define BUFSIZE 100
        
        struct CELL {
          int kazu;
          struct CELL *next;
        };
        
        int main(void)
        {
          char buf[BUFSIZE];
          struct CELL *head, *tail;
      struct CELL *tmpc;
          
        
          head = NULL;
          tail = NULL;
        
          while(1) {
            printf("Input kazu -> ");
            fgets(buf, BUFSIZE, stdin);
            buf[strlen(buf)- 1] = '\0';
        
            if (strcmp(buf, "owari") == 0) {
              break;
            } 
        
            tmpc = (struct CELL *)malloc(sizeof(struct CELL));
            if (tmpc == NULL) {             
              printf("memory allocation error!!\n");
              exit(EXIT_FAILURE);
            }
              tmpc->kazu = atoi(buf);  
        
            if(head == NULL) {
              head = tmpc;
            } else {
              tail->next = tmpc;
            }
            tail = tmpc;
            tail ->next = NULL;
          }
    
          for (tmpc = head; tmpc!= NULL; tmpc = tmpc->next) {
            printf("%d\n", tmpc->kazu);
          }
          return 0;
        }


有難うございました。


この投稿にコメントする

削除パスワード

No.7171

Re:リンクトリストへの配列の格納
投稿者---ルナレルナ(2007/02/26 11:08:51)
http://park6.wakwak.com/~nougaki/mini_program/


free()してない。


この投稿にコメントする

削除パスワード

No.7181

Re:リンクトリストへの配列の格納
投稿者---蒼(2007/02/26 15:10:22)


あ、そうですね、freeがありませんでした。
ありがとうございます。追加しました。


この投稿にコメントする

削除パスワード

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





掲示板提供:(有)リアル・インテグリティ