質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

231閲覧

scanfの処理について

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2019/01/02 08:19

この問題(http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_C&lang=jp#)に対して以下のように解答し、入力例にある通り

7
insert 5
insert 2
insert 3
insert 1
delete 3
insert 6
delete 5

を入力すると、最後の「delete 5」だけ読み込まれずにscanfを一回受け付けるようになってしまいます。
また入力の際にまとめて貼り付けのではなく、
7→エンター→insert 5→エンター ・・・・
と入力すれば逆に最後のall_printfが機能しなくなります。

ソースコードを見返しても理由がわからないのですが、理由を教えて頂くことは可能でしょうか?

#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct node{ int key; struct node *next; struct node *before; }node; node *home=NULL; void insert(int x){ node *new=calloc(1, sizeof(node)); if(home == NULL){ home=new; new->key=x; new->before=NULL; new->next=NULL; } node *old_home=home; home=new; old_home->before=new; new->next=old_home; new->key=x; new->before=NULL; } void deleteFirst(){ node * old=home; if(home->next ==NULL)home=NULL; home=home->next; home->before=NULL; free(old); } void deleteLast(){ node *last; node *next; while((next->next) !=NULL){ next=next->next; } last=next; if(next->before ==NULL)home=NULL; (next->before)->next=NULL; free(last); } void delete(int x) { node *next; if (home == NULL) return; next = home; while (next != NULL) { if ((next->key) == x) { if (next == home) { deleteFirst(); return; } else if ((next->next) == NULL) { deleteLast(); return; } else { (next->before)->next = next->next; free(next); return; } } next = next->next; } return; } void all_printf() { node *next; while(next !=NULL){ int x=next->key; printf("%d ",x); next=next->next; } /*ここより上は処理なので参考までに載せています*/ } int main(){ int i,m,n; char order[13]; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%s",order); if(strcmp(order,"insert")==0){ scanf(" %d",&m); insert(m); }else if (strcmp(order,"delete")==0){ scanf(" %d",&m); delete(m); }else if (strcmp(order,"deleteFirst")==0){ deleteFirst(); }else if (strcmp(order,"deleteLast")==0){ deleteLast(); } } all_printf(); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iwanote

2019/01/02 08:42

ところどころ初期化せずに使用しているポインタがありますが、そこは正常に動作していますか?私の環境ではコンパイルエラーとなりますが・・・
bochan2

2019/01/02 08:44

よく頑張りましたね 出来ればインデントをつけて頂けますか?
退会済みユーザー

退会済みユーザー

2019/01/02 09:05

私の環境だと特にエラーは出ていないです。 コードをビルドすると 「====================[ ビルド | untitled1 | Debug ]================================= /Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build /Users/XXX/CLionProjects/untitled1/cmake-build-debug --target untitled1 -- -j 2 Scanning dependencies of target untitled1 [ 50%] Building C object CMakeFiles/untitled1.dir/main.c.o [100%] Linking C executable untitled1 [100%] Built target untitled1 ビルド finished 特にエラーなくビルド(コンパイル)できているようです。
退会済みユーザー

退会済みユーザー

2019/01/02 09:08

インデントをつけたつもりでしたので、どの辺りをどのように修正を加えればいいのか教えて頂くことは可能でしょうか?
episteme

2019/01/02 09:21

all_printf がマトモに動くとは思えないんだが。
fu7mu4

2019/01/13 06:48

ビルドしたソースコードとここに添付されたコードが違うのでしょう。gcc v7ではこのような警告がでます。 hoo.c:26:21: warning: Use of memory after it is freed old_home->before=new; ~~~~~~~~~~~~~~~~^ hoo.c:34:8: warning: Use of memory after it is freed if(home->next ==NULL)home=NULL; ^~~~~~~~~~ hoo.c:35:10: warning: Access to field 'next' results in a dereference of a null pointer (loaded from variable 'home') home=home->next; ^~~~~~~~~~ hoo.c:36:17: warning: Use of memory after it is freed home->before=NULL; ~~~~~~~~~~~~^ hoo.c:43:11: warning: Dereference of undefined pointer value while((next->next) !=NULL){ ^~~~~~~~~~~~ hoo.c:78:16: warning: The left operand of '!=' is a garbage value while(next !=NULL){ ~~~~ ^
guest

回答1

0

たとえば、all_printfのコードを見ると、

C

1void all_printf() { 2 node *next; 3 while(next !=NULL){ 4 int x=next->key; 5 printf("%d ",x); 6 next=next->next; 7 } 8}

となっていますが、ここでのnextにはなにが入っているかわかりません。
そのため、while文の中のコードはまったく訳のわからないコードになってしまっています。
他の関数にもこのような事が見られるので、何か勘違いしているのではないかと思います。

投稿2019/01/02 09:27

iwanote

総合スコア295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/01/02 14:55

少し修正致します。ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問