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

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

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

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1273閲覧

次々と標準入力したいのに止まってしまう

setsu119

総合スコア1

C

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/06/27 07:51

前提・実現したいこと

二分探索で配列を使ったデータの保存と探索を行う。

発生している問題・エラーメッセージ

標準入力で次々にデータを入力していきたいのですが、1つ入力が終わると実行が止まってしまいます。

該当のソースコード

少し長いですが、、、
c言語です。

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

//* データのを保存する配列のサイズとidの保存先の配列のサイズ
#define TABLE_SIZE 1000000
#define MAX_CHAR 10000000

//* データの構造
struct item{char *id; int info;};

struct item table[TABLE_SIZE];
//* データ数
int count;

int char_top = 0;
char char_heap[MAX_CHAR];

//* idの保存
char *save_string(char *s){
int result;

result = char_top;
for(;;){
if(char_top >= MAX_CHAR){
printf("string buffer overflow\n");
exit(1);
}
char_heap[char_top] = *s;
char_top++;
if(*s == 0)
break;
s++;
}
return(&char_heap[result]);
}

//* 初期化
void initialize_table(void){
count = 0;
}

//* 二分探索によるデータの挿入
void insert_table(char *id, int info){
int lo, hi, mid;
int i;
struct item tmp;
if(count >= TABLE_SIZE){
printf("overflow\n");
exit(1);
}
char char_heap1 = save_string(id);
//
一回目の挿入
if(count == 0){
table[0].id = char_heap1;
table[0].info = info;
count++;
}

lo = 0;
hi = count - 1;
while(lo <= hi){
mid = (lo + hi) / 2;
if(strcmp(id, table[mid].id) < 0)
hi = mid - 1;
else
lo = mid + 1;
}
if(hi >= 0 && strcmp(id, table[hi].id) == 0)
exit(1);
else if(hi >= 0 && strcmp(id, table[hi].id) < 0){
tmp = table[hi];
table[hi].id = char_heap1;
table[hi].info = info;
count++;
for(i = count-1; i > hi+1; i--)
table[i]= table[i-1];
table[i] = tmp;
}
else if(hi >= 0 && strcmp(id, table[hi].id) > 0){
tmp = table[hi+1];
table[hi+1].id = char_heap1;
table[hi+1].info = info;
count++;
for(i = count-1; i > hi+2; i--)
table[i] = table[i-1];
table[i] = tmp;
}
}

//*  データの探索
int search_table(char *id){
int lo, hi, mid;

lo = 0;
hi = count - 1;
while(lo <= hi){
mid = (lo + hi) / 2;
if(strcmp(id, table[mid].id) < 0)
hi = mid - 1;
else
lo = mid + 1;
}
if(hi >= 0 && strcmp(id, table[hi].id) == 0)
return (hi);
else
return (-1);
}

int main(void){
int t;
char command[100], name[100];
int year;

initialize_table();
for(;;){
if(scanf("%s %s", command, name) == EOF)
break;
if(command[0] == 'I'){
t = search_table(name);
if(t == -1){
scanf("%d", &year);
insert_table(name, year);
}
else
printf("The name has already been registered\n");
}
else if(command[0] == 'S'){
t = search_table(name);
if(t == -1)
printf("not found.\n");
else
printf("%d\n", table[t].info);
}
}
return 0;
}

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

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

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

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

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

y_waiwai

2021/06/27 07:52

このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
guest

回答2

0

[回答ではありません]が、回答に導くために確認。
insert_table() 内の exit() は何のため? 何が起こったからexit()してるんでしょうか?

table[] 内のデータ中に挿入しようとしているデータが存在していたとき、
それを許さないためのexit()と推察しました。
だとすると:

// 一回目の挿入~ で最初のひとつは無条件で挿入され、
その後二分検索しています。
そのとき一回目の無条件に挿入したデータが見つかり、結果 exit() してしまいそうです。

投稿2021/06/27 11:13

episteme

総合スコア16612

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

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

setsu119

2021/06/28 10:41

回答ありがとうございます 無事解決しました!
episteme

2021/06/28 11:36

どう解決したんです?
setsu119

2021/07/02 02:43

指摘の通りexitの部分で抜けてしまっていたようです。
episteme

2021/07/02 02:49

それは原因。どう解決したんです?
guest

0

ベストアンサー

insert_table() の if(hi >= 0 && strcmp(id, table[hi].id) == 0) { の中の exit()で終了してませんか?

何でそうなるかまでは追えてませんが、とりあえず。


デバッグ方法を考えた方が良いのでは?

投稿2021/06/27 08:12

pepperleaf

総合スコア6385

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

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

setsu119

2021/06/28 10:41

無事解決しました 回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問