Предупреждение компилятора, когда char * установлен в строковый литерал - PullRequest
1 голос
/ 22 января 2012

В моем коде у меня есть

char* s = strchr(first,'/');
if(s==NULL) s = "";
else s = s+1;

Но мой компилятор gcc жалуется на предпоследнюю строку с

warning: assignment discards qualifiers from pointer target type

Из того, что я понимаю о ANSI C, это потому, что я устанавливаю s (неконстантное значение) в строковый литерал (константное значение). (Я здесь не прав?) Но мне нужно, чтобы s был неконстантным (потому что я могу изменить его значение, добавив к нему 1), и мне также нужно установить s в пустой строковый литерал. Есть ли у меня какие-либо варианты с точки зрения лучшего дизайна кода здесь для достижения этих двух целей без крика компилятора?

У меня включен флаг -Wwrite-strings.

Ответы [ 4 ]

3 голосов
/ 22 января 2012

Если вы хотите написать:

char * s = "Red";
if (Massachusetts) {
   s = "Blue";
}

, просто добавьте const.Он будет работать нормально.

Если вам действительно нужно изменить строку , тогда

char *s = malloc(64);
strcpy (s, "Red");
if (Massachusetts) {
    strcat(s, "-not");
}
1 голос
/ 22 января 2012

Если вы не собираетесь изменять объект, на который указывает s, измените тип s на const char *s;.

Если вы собираетесь изменить его, то наведите его наСтрока, содержимое которой запрещено изменять (независимо от того, является ли она недопустимой для языка C или просто по контрактам с остальными интерфейсами вашей программы), является серьезной ошибкой, и вам нужно обязательно делать копию строки всякий раз, когдавероятность, что вы можете изменить его.

1 голос
/ 22 января 2012

Вам нужно s, чтобы не быть const, или вам нужно s, чтобы не обращаться к постоянному хранилищу? Там большая разница. В первом случае вы можете просто привести к char*. В последнем случае вы должны распределить нужное хранилище (или присвоить s с адресом char[] значения соответствующей области).

0 голосов
/ 22 января 2012

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

Например, если у вас есть:

char str[100];
str = "Hello world";

Адрес выделенных 100 символов будет заменен адресом "Hello world" постоянной строки.

Самый простой способ сделать строку пустой - это установить первое значение в NULL (*s = NULL);

...