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

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

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

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

Q&A

解決済

3回答

4200閲覧

C言語 sscanf 読み飛ばしを行いたい

marchan

総合スコア4

C

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

0グッド

0クリップ

投稿2021/12/15 15:24

前提・実現したいこと

以下のコードで正常に動作はするのですがdami1,2を使いたくないです。
こういうことをせずに読み飛ばすやり方があれば教えてください。

該当のソースコード

C

1#include <stdio.h> 2struct tenpo 3{ 4 char name [3*sizeof"新宿駅西口"]; 5 double k; 6 double i; 7 int a; 8}; 9 10int main(void){ 11 struct tenpo a,b; 12 char dami1[3*sizeof"経度:"]; 13 char dami2[3*sizeof"経度:"]; 14 char s[]="池袋 緯度: 35.701554 経度: 139.636884"; 15 sscanf(s,"%s %s %lf %s %lf",a.name,dami1,&a.k,dami2,&a.i); 16 printf("%s %lf %lf",a.name,a.k,a.i); 17 return 0; 18}

実行結果

池袋 35.701554 139.636884

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

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

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

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

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

jimbe

2021/12/15 16:32

scanf のドキュメントをお探しください。
guest

回答3

0

自己解決

sscanf(s,"%s %s %lf %s %lf",a.name,dami1,&a.k,dami2,&a.i);
部分を以下のように変更しいろいろ試しました。okは想定どうりうまくいきngはうまくいかなかったものです。うまくいくやり方で記述したと思っていたのですが、なんか勘違いしてngのようなやり方で記述してしまいハマってしまったのかな?と思いました。

//sscanf(s,"%s %*s %lf %*s %lf",a.name,&a.k,&a.i);//ok //sscanf(s,"%s 緯度: %lf 経度: %lf",a.name,&a.k,&a.i);//ok //sscanf(s,"%s 緯度:%lf 経度:%lf",a.name,&a.k,&a.i);//ok //sscanf(s,"%s緯度:%lf経度:%lf",a.name,&a.k,&a.i);//ng sscanf(s," %s 緯度: %lf 経度: %lf",a.name,&a.k,&a.i);//ok

投稿2021/12/23 00:34

marchan

総合スコア4

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

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

0

"%s" の代わりに、"%s" と書くか、" 緯度:" と書くか、" %[^ ]" と書くか。
ドキュメントを見て、いろいろ試してみてください。

追記
scanf(書式、引数...) において、引数は格納先へのポインタです。

書式は、複数の指令を並べたものです。

指令には、次の 3種類があります。
・空白類文字 (isspace関数で規定される文字 ' ', '\t', '\n', '\v', '\f', '\r')
・通常の文字
・%で始まる変換指定

指令の空白類文字は、入力の 0個以上の空白類文字を読み飛ばします。

指令の通常文字は、それと一致する入力文字を読み飛ばします。

変換指定は、%d, %s, %c などですが、%c と %[ と %n 以外は、
入力の空白類文字を読み飛ばした後、指定した変換処理を行います。

scanf("A=%d", &n); なら、"A"、"="、"%d" の 3つの指令があり、
入力の "A=45" や "A= 45" で、n に 45 を読み込めますが、
入力の "45" や "A = 45" では、n に 45 を読み込めません。

%d は数字の列を読み込んで数値に変換しますが、
数字の列の終わりを知るために、1つ余分に文字を読み込みます。
しかし、その文字は入力バッファに押し戻されて、次の入力に使用されます。

以上の scanf の基本的な機能を理解できましたか?

投稿2021/12/15 23:47

編集2021/12/23 00:48
kazuma-s

総合スコア8224

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

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

0

やり方があれば

あります。

JIS X3010(ググればたどり着くはずです)の7.19.6.2 fscanf関数の項をみてください。
(規格書なんで、わかりやすく親切な記述というわけではありませんが)

投稿2021/12/15 22:43

thkana

総合スコア7629

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問