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

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

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

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

Q&A

解決済

2回答

1205閲覧

実行結果が思うようにいかない

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2017/12/23 10:42

編集2017/12/24 01:50

以下のdata_tel.txtがあります。実行すると段になってしまいます。
data_tel.txtのような表示になるようにコードを直したいのですが、
わかりません。data_tel2.txtの090-7777のまえの空白を詰めると正しく表示されたのですが、このままでdata_tel2.txtを表示する方法がありますか。あったら
教えてください。

コード /* data_tel2.txt naka , 090-7777 kiyoko , 090-9999 satou , 090-3214 kinosita , 090-8679 yamada , 090-4325 #include<stdio.h> #include<string.h> //for strcmp,strstr #include<stdlib.h> //for exit #define N 256 #define MAX 100 // MAX100人 char names[MAX][15]; // MAX100人、20文字 char tel[MAX][15]; // MAX100人、20文字 int val; // 名前と番号の配列番号 void data_show(); // データ表示 int main() { data_show(); } void data_show() { FILE *fp; val=0; if(!(fp = fopen("data_tel2.txt", "r"))){ printf("ファイルを開くことができません\n"); exit(1); } printf("\n名前 番号\n"); printf("-------------------------\n"); while(fscanf(fp, "%s%s", names[val], tel[val])!=-1) { printf("%-10s%5s\n",names[val], tel[val]); val++; } fclose(fp); } 実行結果 naka@naka ~/kadai naka@naka ~/kadai $ gcc -o data_delete4 data_delete4.c -Wall naka@naka ~/kadai $ data_delete4 削除する名前を検索します。検索する名前を入力して下さい。 naka naka , // ここをコロンをはずして naka だけ表示したい name_len=4 削除された名前: naka 名前 番号 ------------------------- naka , 090-7777 kiyoko , 090-9999 satou , 090-3214 kinosita , 090-8679 yamada , 090-4325 naka@naka ~/kadai $

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

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

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

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

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

guest

回答2

0

ベストアンサー

sscanf(3)のformat指定を確認して下さい。

「%s」は空白文字(空白、タブ、改行)で区切られた文字列を変数に読み込むという意味ですので、

fscanf(fp, "%s%s", names[val], tel[val])

この指定では、以下の順番で文字列が読み込まれます。(実行結果では、実際のその通りに表示されていますね)

data_tel.txt 1[naka] 1[,] 2[090-7777]\n 2[kiyoko] 3[,] 3[090-9999]\n 4[satou] 4[,] 5[090-3214]\n 5[kinosita] 6[,] 6[090-8679]\n 7[yamada] 7[,] 8[090-4325]\n

つまり、真ん中の「,」を読み飛ばす必要があります。

参考:
https://ja.wikipedia.org/wiki/Scanf

投稿2017/12/23 12:28

hichon

総合スコア5737

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

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

退会済みユーザー

退会済みユーザー

2017/12/23 22:53

ありがとうございます。真ん中の「,」を読み飛ばして表示できました。 最初に保存していた関数で実行したらdatas_tel.txtが正常に表示されました。よく見たら質問のlenが4なのでおかしいということも分かりました。 lenが5になっていてこちらも正常になっていました。これを用いてdelete()を完成したいと思います。
guest

0

入力ファイルに空白が含まれることをfscanfに渡しているformat文字列が想定していないからです

投稿2017/12/23 10:52

yumetodo

総合スコア5850

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問