C ++: предупреждение о назначении указателя на strchr () - PullRequest
2 голосов
/ 05 сентября 2010

Я получаю ошибку assignment makes pointer from integer without a cast в следующем коде, что это значит?

char * splitter;
if(splitter = strchr(key, ':') != NULL && *(splitter + 1) == ' ')

Ответы [ 4 ]

3 голосов
/ 05 сентября 2010

Это из-за приоритета операций. Вам нужно поставить дополнительный набор паренов, чтобы убедиться, что это происходит в правильном порядке:

char * splitter;
if((splitter = strchr(key, ':')) != NULL && *(splitter + 1) == ' ')

в противном случае он будет оцениваться так:

splitter = (strchr(key, ':') != NULL)

Поскольку strchr(key, ':') != NULL будет иметь значение 1 или 0, в вашем примере вы назначаете целое число для типа указателя, отсюда и предупреждение.

однако, я бы просто написал это, как во втором примере, так как он проще и менее подвержен ошибкам. Сокращение на одну строку ничего не добавляет, кроме сложности.

2 голосов
/ 05 сентября 2010

Оператор неравенства! = Имеет более высокий приоритет, чем оператор присваивания =, поэтому ваша исходная строка читается как splitter = (strchr(key, ':') != NULL), а не как предполагалось (splitter = strchr(key, ':)) != NULL, поэтому компилятор пытается присвоить разделителю результат сравнения междуstrchr () и NULL.

1 голос
/ 05 сентября 2010

!= имеет более высокий приоритет, чем =.Вы должны полностью заключить в скобки:

if (((splitter = strchr(key, ':')) != NULL) && (*(splitter + 1) == ' '))
1 голос
/ 05 сентября 2010

Оператор != имеет более высокий приоритет, чем оператор =.Это означает, что ваше выражение splitter = strchr(key, ':') != NULL фактически интерпретируется как splitter = (strchr(key, ':') != NULL).

. Поместите присвоение в скобки, чтобы увеличить приоритет этой части:

(splitter = strchr(key, ':')) != NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...