2015-02-05 4 views
0

Я пишу небольшую функцию в C, которая устраняет ведущие пробелы, но это дает мне выражение, которое должно быть изменяемым значением lvalue.«Ошибка: выражение должно быть изменяемым значением lvalue» при попытке изменить местоположение указателя char *

char str1[20]; 
strcpy (str1, otherStr); 

for (int i = 0; i < strlen(str1); i++) 
{ 
    if (!isspace(str1[i])) 
     str1 = &(str1[i]); 
} 

Что я здесь делаю неправильно? (И да, определяется другойStr)

+0

Вы не можете изменить, где находится массив, он статически выделяется компилятором во время компиляции. Это правда, что массивы * распаковываются * указателями, но они не являются указателями. Если вы хотите использовать его как истинный указатель, вам нужно использовать фактический указатель. –

+0

В коде отсутствует указатель 'char *'. Массив не является указателем. – AnT

ответ

2

В коде отсутствует указатель char *, который можно было бы изменить. Массив не является указателем. Вы не можете «изменить» его местоположение.

В массивах языка C сами объекты не поддается изменению lvalues, в котором возникает формулировка ошибки.

+0

'& (str1 [i])' is 'char *', я не уверен, что OP это понимает. – ouah

+0

Теперь я делаю. спасибо – user2824889

0
char *str1 = malloc(20); 
// or 
// char s[20]; 
// char * str1 = s; // note the lack &s 
// or 
// char *str1 = alloca(20); 
strcpy (str1, otherStr); 

for (int i = 0; i < strlen(str1); i++) 
{ 
    if (!isspace(str1[i])) 
     str1 = &(str1[i]); 
} 

Ваш код не работает, потому что, когда char str1[20] то str1 не является переменной - в большинстве случаев это указатель буквальным, похожий на (void *)0x0342 бы. Вы не можете сделать 0x0342 = 7;, чтобы вы не могли назначить имя массива.

 Смежные вопросы

  • Нет связанных вопросов^_^