2012-02-10 25 views
1

これは単純ですが、char配列へのポインタはまだ私の頭を傷つけることがあります。 gccは4行目と5行目で "添え字付きの値が配列もポインタでもない"と、8行目と11行目で "unary *"の引数が無効であると不平を言っています。私は行4と5をブラケットを使って逆参照するように変更しましたが、それでも私が望むものを得ることはできません。Cポインタの混乱 - char配列へのポインタ

これはかなり単純な関数でなければなりません:あなたはsafeunsafeの前にアスタリスクを必要としない

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は、charへのポインタです(配列へのポインタではありません)。だから*safeと書いてありますが、それは普通のcharです。 (*safe)[offset]の代わりに試してみてください​​です。 *safe[offset]の場合も同じです。unsafeの場合も同じです。

2番目の問題は、文字を比較する方法です。 "\ 0"は文字列のリテラルです。あなたのコードでは、の文字リテラルが必要です。

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

しかし\00あるので、あなたは、それを書き換え、それを簡単にできます:要するに、forはする必要があります

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

これは、あなたが '*'を必要としない理由です。 角括弧[]で囲まれた後置式は、配列オブジェクトの要素の添字 の指定です。添え字演算子[] の定義は、E1 [E2]は(*((E1)+(E2))と同じです)。 がバイナリ+演算子に適用される変換規則のために、E1が配列オブジェクト(つまり、配列オブジェクトの 初期要素へのポインタ)であり、E2が整数である場合、E1 [E2]はE2番目 E1の要素(ゼロから数えて)。 – Fred

+0

うわー、それは複雑です。これは、ポインタがいつも逆参照されてから、添え字が追加されることを意味しますか?私は、コンパイラがポインタの配列であると仮定し、 '安全' + [オフセット]のアドレスを使用して、そのアドレスを逆参照することを心配しました。 –

+1

いいえ 'a [i]'は '*(a + i)'と等価です。 'a + i'の* result *は逆参照されます(IOW、逆参照の前にオフセットが追加されます)。あなたが 'char(* safe)[]'( 'char'の配列へのポインタ)として' safe'を宣言していたならば、添え字を適用する前にポインタを逆参照する必要があります'* safe [i]'は、(* safe)[i] 'ではなく' *(safe [i]) 'として解析されます。問題)。 –

1

。彼らはすでに指摘している。 また、二重引用符の代わりに一重引用符を使用する必要があります。単一引用符は文字のためのもので、二重引用符はスティッキングのためのものです。

3

文字定数は、単一引用符の代わりに二重引用符が必要です。'\0', '\n', '\r', and '~'

また、safeへの割り当ては、constとマークされているため、おそらく許可されません(otで既に説明した間接的な問題を修正した後彼女の答え)。

2

ポインタunsafesafeは、文字配列の最初の項目を指します。

safe[4]そこでコードがCとC++で

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")であるべきである5番目の文字

すなわちアレイ内の(ゼロから数えて)第5項目であるであろう文字の配列