
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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
MS SQLServer のSQLで文字列の...
-
Msgboxの×が押されたとき
-
同一セル内に関数と文字列を同...
-
エクセル 数値データを桁をそ...
-
Excelで指数表現しないようにす...
-
【excel】複数のセルを対象に特...
-
Left関数とRight関数を合わせた...
-
VBA instr関数で文字列を途中か...
-
LEFT関数で文字数を指定しない...
-
初歩的で申し訳ないですが…ADO...
-
VBAによるBinaryの置換後に先頭...
-
Excelで3E8を3.00E+8にしない方...
-
文字列から文字列を検索するプ...
-
エクセルで文字列をtxtファイル...
-
OutofMemory.Exceptionのエラー
-
ABCDEFをすべて使って時書式に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
エクセルで文字列をtxtファイル...
-
【Excel VBA】複数ある特定の文...
-
エクセル 数値データを桁をそ...
-
Excelで3E8を3.00E+8にしない方...
-
VBA2005 16進を2桁で表示したい。
-
エクセルで文字列の最大値を抽...
-
同一セル内に関数と文字列を同...
-
Left関数とRight関数を合わせた...
-
Excelで指数表現しないようにす...
-
MS SQLServer のSQLで文字列の...
-
VBの「As String * 128」とは?
-
エクセルでセル内の文字列の最...
-
ORCLEでの小数の表示方法の変更...
-
bashスクリプトでの文字列から...
-
LEFT関数で文字数を指定しない...
-
アクセスで特定の数字以外(複...
おすすめ情報