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

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

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

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

Q&A

解決済

3回答

1883閲覧

C言語を勉強中です

jabu

総合スコア38

C

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

0グッド

0クリップ

投稿2015/03/13 17:48

C言語の、0の値についての質問です。
現在、勉強中の読んでいるC言語の参考書で下記の様なプログラムがあります。

lang

1/* 2 文字列を走査して表示する 3 */ 4 5#include <stdio.h> 6 7/*--- 文字列sを表示(改行はしない)---*/ 8void put_string(const char s[]) 9{ 10 int i = 0; 11 while (s[i]) 12 putchar(s[i++]); 13} 14 15int main(void) 16{ 17 char str[128]; 18 19 printf("文字列を入力してください:"); 20 scanf("%s", str); 21 22 printf("あなたは"); 23 put_string(str); 24 printf("と入力しました。\n"); 25 26 return 0; 27} 28

このコードで、文字列の入力を:「F07」と入力したとして、結果は「あなたはF07と入力しました。」と出るのですが、put_string関数のwhile (s[i])のループ判定でs[1]の値は"0"なのにwhileを抜けないのはなぜでしょうか?どなたかご回答をよろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

【数字の】0は内部的(バイナリ)にも0ですが、
【文字の】'0'は48(0x30)、
【文字列の】"0"は48(0x30)+0(null)の2バイトです。

このうち、while(式)で偽と判断されるのは、数字の0だけです。
なお'0'と"0"もC言語的には別なので、区別することを心がけてください。

投稿2015/03/14 01:38

hotta

総合スコア1613

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

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

jabu

2015/03/14 02:12

hotta 様 ご回答ありがとうございました。 大変勉強になりました!
guest

0

ベストアンサー

s の内容を表示する関数を次のようにしてみてください。

lang

1void put_string(const char s[]) 2{ 3 int i = 0; 4 while (s[i]) 5 putchar(s[i++]); 6 7 printf("\n"); 8 for (int i = 0; ; i++) { 9 printf("[%d %c] ", s[i], s[i]); 10 if (s[i] == 0) { 11 break; 12 } 13 } 14}

追加した2つ目のループでは、1文字毎に char と int で 表示をさせています。
実行すると次のようになります。

$ ./a.out 文字列を入力してください:F07 あなたはF07 [70 F] [48 0] [55 7] [0 ] と入力しました。

s には int で見た場合は、 [70, 48, 55, 0] の値が入っています。
文字としては 70 は "F", 48 は "0", 55 は "7" に相当します。(0 は相当する文字は無し)
c言語では 文字列の最後は 0 が入ることになってます。
文字コード表を参照してください。
http://homepage2.nifty.com/k_maeda/code/ascii.html

投稿2015/03/13 23:24

katoy

総合スコア22324

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

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

jabu

2015/03/14 02:11

katoy様 ご回答ありがとう御座いました。 大変解りやすく良い勉強に成りました! 文字コード表も参考にさせていただきます!
guest

0

s[1]に格納されている"0"は文字型だからじゃないでしょうか?

投稿2015/03/13 18:22

tomomo

総合スコア430

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

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

jabu

2015/03/14 02:13

tomomo 様 ご回答ありがとうございました。 大変勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問