这应该很简单,但是指向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 }
}
答案 0 :(得分:3)
在你的代码中safe
是一个指向char的指针(不是指向数组的指针)。所以当你说*safe
那是一个普通的char
时。 而不是(*safe)[offset]
尝试safe[offset]
。 *safe[offset]
也是如此,unsafe
同样如此。
第二个问题是你比较角色的方式。 “\ 0”是字符串文字。在您的代码中,您需要字符文字。简而言之,for
应该是:
for (; safe[offset] != '\0' ; offset++)
但是你可以重写它并使其更简单,因为\0
是0
:
for (offset=0; safe[offset]; offset++)
答案 1 :(得分:3)
字符常量需要单引号而不是双引号:'\0', '\n', '\r', and '~'
此外,可能不会允许safe
的分配,因为它被标记为const
(在修复其他答案中已经提到的间接问题之后)。
答案 2 :(得分: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 */
}
注意,C和C ++中的字符串("a string"
)是一个字符数组。
答案 3 :(得分:1)
safe
和unsafe
前面不需要星号。他们已经指点了。
此外,您必须使用单引号而不是双引号。单引号用于表示,双引号用于表示。