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

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

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

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

Q&A

解決済

1回答

1508閲覧

数字を数値に変換(gがなぜか入る件)

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2018/08/14 05:43

編集2018/08/14 05:45

C

1  #include <stdio.h> 2 #include <string.h> 3 4 5 int main(){ 6 7 int i; 8 char x[100]; 9 char s[100]; 10 char a[256] = "'"; 11 char b[6] = "'"; 12 13 14 fgets(s,sizeof(s),stdin); 15 sscanf(s,"%s",x); 16 17 s[1] = "'"; 18 19 strcat(a,s); 20 strcat(a,b); 21 22 printf("%s",a); 23 24 25 return 0; 26

打ち込んだ数字をシングルクオーテーションで囲んでやるというプログラムなのですが

なぜか実行結果が下のようになってしまいます

beike@beike-VirtualBox:~/cj$ ./a.out
1
'1g'

原因がわかる方回答よろしくお願いします

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

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

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

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

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

guest

回答1

0

ベストアンサー

s[1] = "'";

これが原因。
文字を入れるつもりだろうけど、文字列を代入しようとしている

s[1] = ''';
で、これでもだめで、
s[1] = ''';
s[2] = '\0';
とするべし


fgets(s,sizeof(s),stdin);

sscanf(s,"%s",x);

んで、これは意味不明。

投稿2018/08/14 05:47

編集2018/08/14 06:10
y_waiwai

総合スコア87747

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

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

退会済みユーザー

退会済みユーザー

2018/08/14 05:54

なんとかできたのですが、\'をはじめてお目にしたのですが\'とは何ですか?
y_waiwai

2018/08/14 05:56

' の文字自身。
退会済みユーザー

退会済みユーザー

2018/08/14 05:57

int x; fgets(s,sizeof(s),stdin); sscanf(s,"%d",&x) の方がいいんですかね
退会済みユーザー

退会済みユーザー

2018/08/14 05:58

¥をつける必要があるのですね
y_waiwai

2018/08/14 06:06 編集

x は使ってないようだから、そもそもsscanf の行は不要なんでは あとでxつかうというなら sscanf(s,"%s",x); でいいけど
退会済みユーザー

退会済みユーザー

2018/08/14 06:36 編集

流石に、xはint型だから%sだめなのでは、、、。 僕は参考書をみて学んだのですが scanfを使わないでこれ使えって、、、。 fgets sscanf についてご教授いただきたいです
episteme

2018/08/14 06:41

char x[100]; じゃなかったのか?
退会済みユーザー

退会済みユーザー

2018/08/14 06:46

すみません 僕のコメントでint x; と定義しています
episteme

2018/08/14 06:48

あ、質問コードじゃないのね。それは失礼。
y_waiwai

2018/08/14 06:53

scanf系の関数は危険なので使わないほうがいいです。 意図しない入力でフリーズしたりバッファオーバフロー起こしたり。 また、引数の型をチェックしないという欠陥もあり
退会済みユーザー

退会済みユーザー

2018/08/14 06:55

scanf系とはsscanfも含まれますか?
y_waiwai

2018/08/14 07:01

含まれます。 まあ、まだsscanfは事前チェックで前出の地雷は避けることはできるんですが、それでも使うべきものではないと、私は思ってます。
退会済みユーザー

退会済みユーザー

2018/08/14 07:04

では、何を使えばよろしいのですか?
y_waiwai

2018/08/14 07:10

数値変換させたいと言うなら、他に変換してくれる標準関数はあります strtol とか strtod とか。 なんなら自分で変換するような関数組んでもいいですし。
rubato6809

2018/08/14 11:21

例えば入力した<文字列>を<数値>に変換したいなら sscanf() でも atoi() でも strtol() でも使って変換する必要がありますけど、、、 そもそも fgets() で入力した<文字列>を、"%s" で<文字列>として読み込みなおす必要があるのか??? 私はy_waiwaiさんほどscanf()系を毛嫌いしてないんですが(笑)、 sscanf() する必要は無いと思うんですよ。fgets() で読み込んだ文字列は、そのまま次の処理に使えば良い。まあ、改行文字 '\n' を消したほうが都合良いだろうな、というのはありますけど、それはsscanf() でなく、もっと簡単にできる事なのだし。
rubato6809

2018/08/14 11:44 編集

> s[1] = "'"; > 文字を入れるつもりだろうけど、文字列を代入しようとしている 文字列を代入する、という言い方は初心者には誤解される危険性大なので、違う言い方をさせていただきます。 「文字列の<先頭アドレス>をs[1] に代入する」と言ったほうが良い。 文字列を代入する、と、アドレスを代入する、ではイメージが違うと思うんですよ。そこはきっちりさせたほうが良いと思う。
yuki23

2018/08/14 11:41

> uhooooooo さん 話が脱線しているようですが、scanf が危険うんぬんの話は初心者は気にしなくて良いです。とりあえず教科書or先生に従ってください。もっと学習が進んだら思い出すので全然構いません。
退会済みユーザー

退会済みユーザー

2018/08/17 06:32

yuki23さんご教授ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問