2012-02-10 3 views
1

Это должно быть простым, но указатели на массивы char по-прежнему оставляют меня почесывать голову иногда. gcc жалуется, что «индексированное значение не является ни массивом, ни указателем» в строках 4 и 5, и «недопустимый аргумент типа« унарный »* на строках 8 и 11. Может ли кто-нибудь объяснить, что здесь происходит не так? Я изменил строки 4 и 5, чтобы разыграть указатель сначала, используя скобки, но все же не могу получить то, что хочу.C-указатель путаницы - указатель на массив символов

Это должно быть довольно простая функция:

1 void makesafestr (const char *unsafe, const char *safe) 
2 { 
3 int offset=0; 
4 for (; (*safe)[offset] != "\0" ; offset++) { 
5  switch ((*unsafe)[offset]) { 
6  case "\n": 
7  case "\r": 
8   *safe[offset] = "~"; 
9   break; 
10  default: 
11   *safe[offset] = *unsafe[offset]; 
12  } 
13  offset++; 
14 } 
} 

ответ

3

В вашем коде safe является указателем на символ (не указатель на массив). Поэтому, когда вы говорите *safe, это просто char. Вместо (*safe)[offset] попробуйте safe[offset]. То же самое касается *safe[offset], то же самое касается unsafe.

Вторая проблема заключается в том, как вы сравниваете символы. «\ 0» - это строка , строка. В вашем коде вы хотите ввести символ буква. Короче говоря, for должно быть:

for (; safe[offset] != '\0' ; offset++) 

Но вы могли бы переписать его и сделать его проще, так как \0 является 0:

for (offset=0; safe[offset]; offset++) 
+0

И вот почему вам не нужно «*». Постфиксное выражение, за которым следует выражение в квадратных скобках [], является индексированным обозначением элемента объекта массива. Определение индексного оператора [] состоит в том, что E1 [E2] идентичен (* ((E1) + (E2))). Из-за правил преобразования, которые применим к двоичному оператору +, если E1 является объектом массива (эквивалентно указателю на начальный элемент объекта ), а E2 является целым числом, E1 [E2] обозначает E2-й Элемент E1 (с нуля). – Fred

+0

Ничего себе, это сложно. Означает ли это, что указатель ВСЕГДА разыменован первым, а затем добавлен индекс?Я был обеспокоен тем, что компилятор может предположить, что это массив указателей, и используйте адрес «safe» plus [offset], а затем разыщите этот адрес. –

+1

Нет. 'A [i]' эквивалентно '* (a + i)'; * result * of 'a + i' разыменовывается (IOW, смещение добавляется до разыменования). Если бы вы объявили 'safe' как' char (* safe) [] '(указатель на массив' char'), * then * вам нужно было бы разыменовать указатель перед применением индекса (и parens вокруг '* safe 'будет обязательным - подписчик имеет более высокий приоритет, чем разыменование, поэтому' * safe [i] 'будет анализироваться как' * (safe [i]) ', а не' (* safe) [i] ', что могло бы вызвать проблемы). –

1

Вам не нужно звёздочки перед safe и unsafe. Они уже указатели. Кроме того, вы должны использовать одинарные кавычки вместо двойных кавычек. Одиночные кавычки для символов, двойные кавычки для укусов.

3

Константы символьные нужны одиночные кавычки вместо двойных кавычек: '\0', '\n', '\r', and '~'

Кроме того, назначение safe, вероятно, не будет разрешено, так как оно отмечено как const (после устранения проблем косвенности, упомянутых в ot ее ответы).

2

Указатель unsafe и safe указывают на первый элемент массива символов.

safe[4] будет пятый элемент (считая от нуля) в массиве т.е. пятого символа

Так что код должен быть

void makesafestr (const char *unsafe, char *safe) /* Do not need const for safe, as you are 
                 constructing it */ 
{ 
    int offset=0; 
    for (; unsafe[offset] != 0 ; offset++) /* Do not need the " - see below. Also would have 
              thought you need to scan unsafe */ 
    { 
     switch (unsafe[offset]) { 
     case '\n': /* Single quotes required as we are dealing with characters and not strings */ 
     case '\r': 
      safe[offset] = '~'; 
      break; 
     default: 
      safe[offset] = unsafe[offset]; 
    } 
    offset++; 
    } 
    safe[offset] = 0; /* In C and C++ strings end with the null character */ 
} 

Обратите внимание, строка ("a string") в C и C++ является массив символов.

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