Сравнивая указатели (с символами) - PullRequest
12 голосов
/ 19 августа 2011

Добрый вечер, у меня есть 2 функции, и каждая из них принимает в качестве аргумента указатель на символ:

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 * с char и char * с char * Мне понадобятся два правильных решения?

Итак, как их сравнить?указатели (на самом деле пуанты) в кратчайшие сроки?

Спасибо.

РЕДАКТИРОВАТЬ

Благодаря Wallacer и Code Monkey сейчасдля сравнения char * to 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;
}

Ответы [ 4 ]

21 голосов
/ 19 августа 2011

Вам нужно использовать 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 
}

если вы хотите использовать массив char , тогда вам нужно отменить ссылку:

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
}
1 голос
/ 19 августа 2011

Ну, сразу же, если вы хотите сравнить пуанты, вам нужно разыменовать их. Это означает, что для сравнения фактического значения символа вам нужно будет позвонить

if (*pointer == someother_char)

Однако при этом будет сравниваться только первый символ в массиве, что, вероятно, не то, что вам нужно.

Чтобы сравнить все это, strcmp должен работать

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

Убедитесь, что ваша другая строка объявлена ​​как символ *

Подробнее: http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

Редактировать: согласно вашему комментарию. Сравнение char * и char не имеет смысла. Один - это символьное значение, другой - адрес в памяти. Сделав это, вы можете разыменовать символ * или ссылаться на переменную значения.

char c;
char* ptr;

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

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

}

Первый метод проверяет, совпадают ли значения. Второй проверяет, действительно ли ptr указывает на память, содержащую c т.е. это ptr указатель на c

Надеюсь, это поможет

0 голосов
/ 02 октября 2014

Использовать функцию srtncmp no srtcmp.

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

См. Следующую ссылку

сравнить строки

0 голосов
/ 19 августа 2011

Строки завершаются нулем.Когда вы используете такие строки, не рекомендуется смешивать их с другими функциями копирования памяти.После того, как вы выполните операцию memcpy, обратите внимание, что строка назначения не будет иметь нулевого завершения.memcmp - это быстрые операции.В противном случае вы можете просто пройтись по каждому символу и выйти, когда найдете разницу.Чтобы использовать strcmp, убедитесь, что обе строки имеют нулевое окончание.В противном случае это приведет к некоторой аварии.

Я предлагаю вам использовать строковые функции, такие как strcmp, strlen, strcpy, для работы со строками, потому что для этого он действительно реализован.

Вы не можете сравнивать два указателя, если оба указателя не ссылаются на один и тот жеместо в памяти.Указатель - это просто адрес ячейки памяти.Что вы действительно хотите сделать, так это сравнить содержимое, а не сравнить адрес, где оно хранится.Поэтому, пожалуйста, используйте strcmp, но я снова предупреждаю вас, что он завершен нулем.

...