web-dev-qa-db-ja.com

Cポインタの比較(文字付き)

こんばんは、2つの関数があり、それぞれがcharへのポインターを引数として受け入れます。

char pointer[255];
func1(char* pointer)
{
...
memcpy(pointer,some_char,strlen(something));
return;
}
func2(char* pointer)
{
...
if (pointer==someother_char) exit(0); //FAILs
//also I have
if(pointer==someother_pointer2char); // FAILs
}

今私は試しましたstrstr、strcmpなど...動作しません。 memcmpを試したかったのですが、静的lenがありません。 char * to charchar * to char *を比較する必要があるので、2つのソリューションが必要ですか?

では、これらのポインタ(実際には指示先)を可能な限り最短で比較するにはどうすればよいですか

ありがとう。

E D I T

wallacerとCode Monkeyに感謝します。char*とcharの比較ができるようになりました:

func1(char* ptr){
char someother_char[255];
char *ptr_char = NULL; //I have to strcmp a few values so this is why I initialize it first
... 
ptr_char = someother_char;
if (strcmp(ptr,ptr_char) == 0) //gtfo and it does...
...
ptr_char = some2nd;
if(strcmp...

多分何か提案...(うーん、比較のための外部関数?)

Suggestion1(Code Monkeyによる)

#include <stdio.h>

int main(void) {
    char tempchar[255];
    tempchar[0] = 'a';
    tempchar[1] = 'b';
    tempchar[2] = '\0';
    char *ptr_char;
    ptr_char = &tempchar[0];
    printf("%s", ptr_char);
    return 0;
}
12
cat9

strcmpを使用する必要があります。あなたがそれを使用しようとした方法を見ていない、これはあなたがそれを使用する方法です:

char *someother_char = "a";
char *pointer = "a";

if (strcmp(pointer, someother_char) == 0) { // match!
}
else { // not matched 
}

次に、charとの比較を行うには、char*に昇格する必要があります。

char *someother_char1;
char test = 'a';
char *pointer = "a";

strncpy((char*)test,someother_char1,sizeof(test));

if (strcmp(pointer, someother_char1) == 0) { // match!
}
else { // not matched 
}

chararrayを使用する場合は、逆参照する必要があります。

char char_array[255];
// don't forget to fill your array
// and add a null-terminating char somewhere, such as char_array[255] = '\0';
char *ptr_somechar = &char_array[0];
char *pointer = "a";

if (strcmp(pointer, ptr_somechar) == 0) { // match!
} else { // not matched
}
21
user195488

さて、すぐに、指示先を比較したい場合は、それらを逆参照する必要があります。これは、実際のchar値を比較するために、呼び出す必要があります

if (*pointer == someother_char)

ただし、これは配列の最初の文字のみを比較します。これは、おそらくあなたがやりたいことではありません。

Strcmpが機能するかどうか全体を比較するには

char* someother_str = "hello strstr";
if(strcmp(pointer, someother_str) == 0) {
    // do something
}

他の文字列がchar *として宣言されていることを確認してください

詳細: http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

編集:コメントに従って。 char *とcharを比較しても意味がありません。 1つは文字値で、もう1つはメモリ内のアドレスです。そうする場合、char *を逆参照するか、value変数を参照することができます。

char c;
char* ptr;

// dereference ptr
if ( c == *ptr ) {
   ...
}

// reference the value
if ( &c == ptr ) {

}

最初のメソッドは、値が同じかどうかを確認します。 2番目は、ptrが実際にc ieを含むメモリを指しているかどうかをチェックします。 ptrはcへのポインタです

それが役に立てば幸い

1
wallacer

関数srtncmp no srtcmpを使用します。

int res = strncmp(str, "¿Cuál es tu nombre? ", 100);

次のリンクを参照してください

文字列を比較

0
Ronald