C指针混淆 - 指向char数组的指针

时间:2012-02-10 17:52:56

标签: c arrays pointers char

这应该很简单,但是指向char数组的指针仍然让我有时会摸不着头脑。 gcc在第4行和第5行抱怨“下标值既不是数组也不是指针”,而第8行和第11行则是“'unary *'的无效类型参数”。有人可以解释这里出了什么问题吗?我更改了第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 个答案:

答案 0 :(得分:3)

在你的代码中safe是一个指向char的指针(不是指向数组的指针)。所以当你说*safe那是一个普通的char时。 而不是(*safe)[offset]尝试safe[offset] *safe[offset]也是如此,unsafe同样如此。

第二个问题是你比较角色的方式。 “\ 0”是字符串文字。在您的代码中,您需要字符文字。简而言之,for应该是:

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

但是你可以重写它并使其更简单,因为\00

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

答案 1 :(得分:3)

字符常量需要单引号而不是双引号:'\0', '\n', '\r', and '~'

此外,可能不会允许safe的分配,因为它被标记为const(在修复其他答案中已经提到的间接问题之后)。

答案 2 :(得分:2)

指针unsafesafe指向字符数组的第一项。

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

注意,C和C ++中的字符串("a string")是一个字符数组。

答案 3 :(得分:1)

safeunsafe前面不需要星号。他们已经指点了。 此外,您必须使用单引号而不是双引号。单引号用于表示,双引号用于表示。