文字列の値を明示的に指定してからそれを比較すると、システムはFALSEを返します。これはシステムによって追加された余分な '\ 0'文字と関係がありますか?そして、それを真にするために私のコードをどのように洗練するべきですか?Cの文字列の長さ
char name[5] = "hello";
if(name == "hello")
{
...
}
文字列の値を明示的に指定してからそれを比較すると、システムはFALSEを返します。これはシステムによって追加された余分な '\ 0'文字と関係がありますか?そして、それを真にするために私のコードをどのように洗練するべきですか?Cの文字列の長さ
char name[5] = "hello";
if(name == "hello")
{
...
}
作るために
char name[]="hello";
if(strcmp(name,"hello")==0){
.....
}
を、あなたが使用する必要がありますstrcmp
!=
と==
は、これらの文字列のベースアドレスのみを比較するためです。 の代わりにchar name[5] = "hello";
のような定義済み配列サイズを使用しないでください。 char name[6] = "hello";
使用時
#include <stdio.h>
#include <string.h>
int main()
{
char a[] = "hello";
char b[] = "hello";
if (strcmp(a,b) == 0)
printf("strings are equal.\n");
else
printf("strings are not equal.\n");
return 0;
}
実際には、nameは文字列 "hello"のアドレスを指すポインタです。あなたはそれらを比較することはできません。だから、代わりにstrcmp
関数を試すことができます。また、ライブラリstring.h
も含めてください。等
:コメントの一つが指摘するよう
strcmp(name,"hello");
さらには、 '\0
' を含むように6のchar配列を取ります。
希望に役立ちます。
_あなたはそれらを比較することはできません_ - できます! –
私はアドレスと文字列を比較することは意味のある比較ではないことを意味します。 –
両方の引数が等しい場合、strcmp()は0を返します。
char name[]="hello";
if(strcmp(name,"hello") == 0)
return TRUE;
else
return FALSE;
OPによって定義された 'name'を' strcmp() 'に渡すと、' name'は* 0ではないので、未定義の動作が呼び出されます。 – alk
変数 "name"に適切な定義が追加されました –
私のコメントに引き続き、あなたは正しく、6-を含むようにname
を初期化します
char name[] = "hello";
を使用することができ、さらに良い'hello
(プラスNUL終端文字)を保持するchar name[6] = "hello";
が必要文字(ヌルバイトを含む)。彼らは関数に渡されたパラメータとしてchar *
またはconst char *
を取るとき
すべてstring.h
の機能はパラメータとしてNULで終わる文字列を期待しています。
最後に、Anuvanshの答えに正しく記載されているように、不等式条件を使用して、2つの文字列が等しいかどうかを判断することはできません。通常の比較関数strcmp
、strncmp
、memcmp
のいずれかを使用するか、文字列が異なる場合はヌルバイトにある各文字列の下にポインタを移動します。
ご質問がある場合は、私に連絡してください。あなたのコーディングには幸運があります。
Cでは、配列名は実際にはその配列の最初の要素へのポインタです。あなたのケースで
:それは偽
を返しますので、
if(name == "hello")
あなたは文字列へのポインタを比較するあなたは、この記事で why is array name a pointer to the first element of the array?
を同じ概念を見ることができるあなたは、単に "含むことができ、文字列。H」ライブラリと、このようにstrcmp()関数
コードを使用:あなたは(有効)!=
または==
を使用して文字列を比較することはできません、それはトゥーレ
コードを4文字でインデントしてコードとしてフォーマットします。 –
"*単純にライブラリを含めることができます*" Cライブラリはコンパイル時には使用されませんが、*コンパイル後に*リンクされます。コンパイルのための* included *は、ライブラリによって提供される関数の* prototype/s *です。 – alk
Cでは、決して同じではない2つのポインタ*を比較しているような文字列を比較することはできません。文字列の比較方法については、['strcmp'](http://en.cppreference.com/w/c/string/byte/strcmp)を参照してください。また、文字列は*終了する必要があることに注意してください。 5文字の文字列には、ターミネータを含めるために* 6文字のスペースが必要です。これらの事実はいずれも[良い初心者の本](http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)にあるはずです。 –
'name'を*文字列として使うつもりなら' hello'(あるいはより良い 'char name [] =" hello ";')を保持するには 'char name [6] =" hello ";' 。どうして? (ヒント:*終止符*文字 ':')に対して '+ 1'を忘れた場合' 'string'として' name'を使用する予定がないなら、 'string.h' *終端された文字列*をパラメータとして期待する関数。 –
@ DavidC.Rankin私は、 '' name '[] = "hello"; '' 'char name2 [] =" hello ";そして最後に' 'strcmp(name1、name2)'を試しましたが、それでもFALSEです。何かそんなにシンプルなので、とてもイライラすることができます... – reiallenramos