Путаница с указателем C - указатель на массив символов - PullRequest
1 голос
/ 10 февраля 2012

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

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

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   }
}

Ответы [ 4 ]

3 голосов
/ 10 февраля 2012

В вашем коде 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++)
3 голосов
/ 10 февраля 2012

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

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

2 голосов
/ 10 февраля 2012

Указатель 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 ++ представляет собой массив символов.

1 голос
/ 10 февраля 2012

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

...