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

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

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

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

Q&A

解決済

4回答

4859閲覧

c言語 strcmpを用いた空白確認について

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2021/07/21 01:45

編集2021/07/21 01:50

C言語初心者です。読みにくいかもしれませんがご了承ください。

文字列変数[5+1]="";
if(!strcmp(文字列変数,"")){
true
} false

こういった処理があったとした場合
処理結果はfalseという認識でよろしいでしょうか。
また自身で調べた際、空白比較の際は!(否定)をつけるケースが多かったのですがその理由は何でしょうか?

読みづらい文章で申し訳ございません。
ご回答よろしくお願いいたします。

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

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

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

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

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

episteme

2021/07/21 01:48

space(5) ってなんですか?
int32_t

2021/07/21 01:49

文字列変数[0] から [5] には何が入っているのですか? 文字列変数[5+1]=""; は何を代入する意図ですか?
退会済みユーザー

退会済みユーザー

2021/07/21 01:51

修正いたしました。 空白5文字と表したかったのでこう書いてしまいました。
int32_t

2021/07/21 01:53

コードはコードブロック「```c」と「```」で囲ってください。
guest

回答4

0

"" って、空白じゃないですが…?
空(から)の文字列です。
比較したいのは空白ですか?空(カラ、文字が何も入ってない文字列)ですか?
フツー、空白とはスペース、タブなどを言います。
C言語ならisspace() の仕様を見てください。

「自身で調べた際、空白比較の際は!(否定)をつけるケースが多かった」とは?
調べた時に見つかった例をちゃんと理解しましょう。! をつける付けないと空文字列を判定することは無関係です。
「みんながこんな風にやっていたからこうした」じゃプログラムは動きません。

付け加えるなら、この程度の短いプログラムなら、チャチャっと書いて動かしてみたほうが、質問するより速いとおもいます。

投稿2021/07/21 02:03

nob.

総合スコア711

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

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

0

まず

C

1 char 文字列変数[5+1] = "";

としたならば、実際の文字列変数はこんな感じになっています。
[0] = 0x00 (\0)
[1] = ?
[2] = ?
[3] = ?
[4] = ?
[5] = ?
※[1]~[5]までは初期化されるかどうかは実装依存

その上で、strcmp で比較したら、
[0] が 0x00 と 0x20 で、不一致。ゆえに strcmp は「0ではない値」を返します。

Cの規約上、0でないものを ! で否定した場合は 0 になります。ですので if の条件式は 0 = 偽 となり、処理結果は false 側に倒れます。

strcmp は「一致すると 0」を返すので、単項否定演算子を使って真偽を逆転させることで、if 文の then~else の対応と一致させられるので、よく使われる手法です。
個人的には strcmp() == 0 と書いた方がわかりやすいとは思いますが。

投稿2021/07/21 02:01

tacsheaven

総合スコア13703

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

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

kazuma-s

2021/07/21 12:04

charの配列を文字列リテラルで初期化するとき、文字数が少ない場合 残りは全部 0 で初期化されます。実装依存ではありません。 規格書(JIS X3010:2003)の次の記述のうち、集成体型は配列型と構造体型の総称です。 6.7.8 初期化 ... 集成体型の要素又はメンバの個数より波括弧で囲まれた並びにある初期化子 が少ない場合,又は大きさが既知の配列の要素数よりその配列を初期化する ための文字列リテラル中の文字数が少ない場合,その集成体型の残りを, 静的記憶域期間をもつオブジェクトと同じ規則で暗黙に初期化する。
guest

0

ベストアンサー

strcmp(s1, s2) は文字列s1、s2 を辞書順で比較し、
s1 < s2 なら 負値
s1 = s2 なら 0
s1 > s2 なら 正値
を返します。

!strcmp(s1, s2) は上記の否定なので、 s1 = s2 のとき true(!=0) となります。
!なんとかなんとか == 0 と同じ。

投稿2021/07/21 01:52

編集2021/07/21 01:57
episteme

総合スコア16614

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

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

0

strcmpは空白だろーが区別はありません。
単純に数値比較ですよ

投稿2021/07/21 01:47

y_waiwai

総合スコア87800

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問