C言語で、NULLとの比較を行う関数として、
strcmp関数を使用したいと考えています。
ある、文字列変数に、
"あいうえお"が入っている場合、
""(何もない)の場合、
下記の例で真の処理と偽の処理、
どちらを通るのでしょうか。
当然、文字列変数が"あいうえお"の場合は、
真の処理を通ると思いますが、
""(何もない)の場合が分かりません。
例として、
~中略~
if( strcmp( 文字列変数, NULL ) != 0 ){
真の処理
}else{
偽の処理
}
~中略~
の時です。
言語によって、NULLは「0」と定義されていたような
記憶もありますが・・
したい事は、文字列変数が""の場合、
偽の処理をするようにしたいです。
プログラムの作り方を教えて下さい。
No.6ベストアンサー
- 回答日時:
#define NULL 0
VC++だとシステムで上の定義があるように、NULL=0です。
先に回答されている方のおっしゃる通り、NULLポインタとNULL文字列は扱いが違います。
文字列はchar配列でNULL=0が来るまでを文字とみなすので、配列の最初に0が来ると、文字なしの文字列となります。
ポインタでも数値でも文字列でも、NULL=0です。メモリ上は同じです。その領域をどのデータ型にあてはめて参照するかで、見方が変わるだけです。
> strcmp( 文字列変数, NULL )
はアドレス0の文字列を参照してしまうので、アドレス0にたまたま”あいうえお"が入っていれば条件は真となりますが、たいていは入っていないので0が来るまで文字列として参照し続けて落ちてしまうこともあり得ます。
プログラムコードとしては
if( strcmp( 文字列変数, NULL ) != 0 )
か
if(文字列変数[0]!=0)
で良いと思います。
No.10
- 回答日時:
補足2: NULLや0をポインタと見なした場合は、空ポインタとか無効ポインタとか言いますが「0番地」となる保障はありませんので、ご注意ください(Windowsなどでは、多分0番地になると思いますが)。
保障されているのは、他のデータや関数の参照に絶対にならない値、であることぐらいです。No.8
- 回答日時:
空ポインタ(マクロNULLが使われるが、中身は0や(void*)0など)と、空文字'\0'と空文字列""は全然別物です。
C言語は昔経験がある程度なので自信はないのですが、strcmpは引数にNULLがあった場合の動作の保証はなかったような気がします(間違っていたらすみません)。
取り合えず、char *p; とした場合。
if( p == NULL || *p == '\0' ){
/* NULLまたは空文字列だった場合の処理 */
} else {
/* 空文字列でなかった場合の処理 */
}
で、strcmpを使わずとも、何とかなるとは思いますが。
なお、*p は p[0] でもよいです。
No.7
- 回答日時:
No.6 です。
コピペミスしました。正しくは
プログラムコードとしては
if( strcmp( 文字列変数, "" ) != 0 )
か
if(文字列変数[0]!=0)
で良いと思います。
です。↓
No.4
- 回答日時:
C++は知らないので、昔ながらのC言語についての解答です。
例として記載されているコーディングの NULL の使い方が間違っています。
誤: strcmp( 文字列変数, NULL )
正: strcmp( 文字列変数, "" )
"誤"のコーディングでは、0番地という値がパラメータとして渡されます。strcmp関数は0番地にある文字列と比較することになりますが、たいていそこは(あなたがコーディングしているこのプログラムにとっては)でたらめな文字列になっています。
"正"のコーディングは、ヌル文字列のアドレスがパラメータとして渡され、意図どおりの結果を返してくれます。
ただし、もしかしたらコンパイラによっては、"誤"のコーディングでも"正"と同じ解釈をするようにstrcmp関数が作られているものがあるかも知れません(つまり方言です)。しかし仮にそうであっても、"正"のコーディングのように、本来の意味どおりのコーディングを心がけるべきです。
No.3
- 回答日時:
#1です。
空文字列は、先頭が'\0'になっている文字列ですから、
例えばstrが空文字列かどうかを調べるには、
if(str[0] == '\0')
でもできます。
ついでに、
strを空文字列にするには
str[0] = '\0'
で良いです。
No.1
- 回答日時:
NULLポインタと空文字列は違います。
空文字列は
char str[] = {'\0'};
なので(右辺は""でも良い)、
空文字列へのポインタは'\0'が格納されているどこか有効な領域を指します。
> strcmp( 文字列変数, NULL )
は、NULLが有効な領域を指していないため誤りです。
空文字列と比較するなら
strcmp( 文字列変数, "" )
とします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- C言語・C++・C# C言語:数値の桁数指定についての質問です。 8 2022/05/26 23:53
- その他(プログラミング・Web制作) awkの文字列比較はPOSIXロケールまたはCロケールにおいてバイナリ値の比較に使えるか gawkな 1 2023/04/22 09:21
- Visual Basic(VBA) EXCEL VBAで教えてください。 1 2022/12/22 04:20
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Ruby 初心者プログラミング 3 2022/10/12 11:31
このQ&Aを見た人はこんなQ&Aも見ています
-
とっておきの「夜食」教えて下さい
真夜中に小腹がすいたときにこっそり作るメニュー、こっそり家を抜け出して食べに行くお店… 人には言えない、けど自慢したい、そんなあなたの「とっておきの夜食」を教えて下さい。
-
秘密基地、どこに作った?
小さい頃、1度は誰もが作ったであろう秘密基地。 大人の今だからこそ言える、あなたの秘密基地の場所を教えてください!
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
C言語 exitの使い方
C言語・C++・C#
-
バッファとは何ですか
C言語・C++・C#
-
文字列の切り出し
C言語・C++・C#
-
-
4
C言語のポインターに関する警告
C言語・C++・C#
-
5
C言語でヘッダファイルにグローバル変数を宣言する
C言語・C++・C#
-
6
#defineの定数を文字列として読み込む
C言語・C++・C#
-
7
ファイル書込みで一行もしくは部分的に上書きする
PHP
-
8
strcmp( )関数について教えて下さい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
文字列からタブコードを取り除...
-
EXCELで=より左の文字を一括で...
-
Left関数とRight関数を合わせた...
-
【Excel VBA】複数ある特定の文...
-
VBAでの Replace関数で、ワイル...
-
vbsからバッチファイル実行時の...
-
Excelで指数表現しないようにす...
-
エクセルで文字列の最大値を抽...
-
C#で年月を比較する
-
Excelで3E8を3.00E+8にしない方...
-
エクセルで文字列をtxtファイル...
-
アクセスで特定の数字以外(複...
-
16進数を10進数に簡単に変換す...
-
同一セル内に関数と文字列を同...
-
VBA2005 16進を2桁で表示したい。
-
CStringの文字列検索&抜き出し...
-
VBの「As String * 128」とは?
-
C# 巨大な文字列の計算をさせたい
-
MS SQLServer のSQLで文字列の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
Excelで3E8を3.00E+8にしない方...
-
エクセルで文字列をtxtファイル...
-
Excelで指数表現しないようにす...
-
【Excel VBA】複数ある特定の文...
-
Left関数とRight関数を合わせた...
-
エクセルで文字列の最大値を抽...
-
同一セル内に関数と文字列を同...
-
VBA2005 16進を2桁で表示したい。
-
VBの「As String * 128」とは?
-
MS SQLServer のSQLで文字列の...
-
エクセル 数値データを桁をそ...
-
C#で年月を比較する
-
16進数を10進数に簡単に変換す...
-
“丸(〇/○/◯)”に似た文字…
-
アクセスで特定の数字以外(複...
-
Msgboxの×が押されたとき
おすすめ情報