1

私の C++ コードは次のようになります。

char* x;
    switch(i){ 
        case 0:
            x = '0';
        case 1:
            x = "1";
        ...}

x = '0'; 最初にコンパイラが不平を言うため、これを機能させる方法がわかりません:

error: invalid conversion from ‘char’ to ‘char*’

そして2番目x = "1";に、コンパイラは次のように不平を言います:

warning: deprecated conversion from string constant to ‘char*’

ここで何をすべきですか?私はこれについて完全に間違っていますか?

4

6 に答える 6

4

case 0あなたは(xタイプのchar)文字に設定しようとしていますが、 (タイプの)C文字列case 1に設定しようとしています。違いを生むのは引用のタイプです。単一引用符は文字を表し、二重引用符は C スタイルの文字列を表します。xchar const[2]

両方の文字列に設定する場合は、0inを二重引用符で囲みますx = '0'

文字に設定xする場合は、両方に一重引用符を使用し、 のよう*xにポインターを逆参照して*x = '0'、 、 または*x = '1'にする、 の型を (文字へのポインター) からx(文字) に変更します。その後、逆参照する必要はありません。1char*char

繰り返しになりますが、文字列に設定しようとしている場合はx、C 文字列の代わりに C++ 文字列を使用した方がよいでしょうstd::string。次に、C 文字列のように二重引用符で囲みますが、自動メモリ管理、境界チェック、およびそれが持つすべてのメンバー関数など、さまざまな追加機能を利用できます。

1 Nicolas Grebille が指摘したように、それを行う前に、次charのいずれかを使用して、有効な を指していることを確認してnewください。

char* x = new char;

またはchar、スタック上に を作成することによって:

char c;
char* x = &c;

重要:

後で (または C 文字列を期待する関数で)char*を使用する場合は、バッファーを適切に終了する必要があります。したがって、次のいずれかの方法で行う必要があります。strcatNULL

char x[2] = {}; // on the stack, filled with NULLs
                // use a bigger number if you need more space

また

char* x = new char[2]; // on the heap, use more than 2 if you're
                       // storing more than 1 character
x[1] = NULL; // set the last char to NULL

そうしないと、運が悪いとガベージが発生し、運が良ければセグメンテーション違反になります。

x次に、上記のように宣言した後、*x = '0'何をしてもかまいません。

を使用する場合new[]は、対応する でメモリの割り当てを解除してくださいdelete[]

于 2011-09-07T02:12:51.773 に答える
3

一般に信じられていることとは反対に、char*は文字列ではありません。std::string代わりに使用してください。

#include <string>

std::string x;
switch(i){ 
    case 0:
        x = "0";
    case 1:
        x = "1";
    ...}
于 2011-09-07T02:11:35.643 に答える
2

char *を使用する場合は、xの宣言を次のように変更することにより、格納する文字列にスペースを割り当てる必要があります。

char x[10]; // allocate a fixed 10-character buffer

または、ヒープ上のスペースを動的に割り当てます。

x = new char[10]; // allocate a buffer that must be deleted later

次に、次を使用できます。

strcpy(x, "1"); // Copy the character '1' followed by a null terminator
                // into the first two bytes of the buffer pointed to by x.

文字列「1」をxが指すバッファにコピーします。2番目の例を使用する場合は、後で行う必要があります。

delete x;

もちろん、本当に文字列を処理したい場合は、より良い方法があり、個々の文字を処理するためのより良い方法もあります(他の回答を参照してください)。

于 2011-09-07T02:17:47.793 に答える
1

スペースを割り当てずにchar ポインターを宣言してから、それに文字を割り当てようとしています。

char x;

タイプの変数を提供しますchar

char *x = new char[10]; 

charポインタが指す10バイトのメモリへのポインタを提供します。

上記のAndréCaronが指摘したように、C ++を使用しているので、実際の文字列を使用して生活を楽にする必要があります。

于 2011-09-07T02:18:10.540 に答える
1

まずは自分の使い道を考えてみてくださいstd::string。選択した道を進むと、間違いなくバグのあるプログラムが作成されます。

そうは言っても、あなたの答えは次のとおりです。 を宣言するx方法とそれに割り当てる方法は、後でそれをどのように使用するかに大きく依存します。以下に一例を示します。

#include <stdio.h>
int main(int ac, char **av) {
  const char* x;      
  switch(ac) {
  case 0:
    x = "0";
    break;
  case 1:
    x = "1";
    break;
  default:
    x = "DANGER!";
    break;
  }
  printf("%s\n", x);
  return 0;
}

この最初の例ではx、3 つの可能な const char 配列のいずれかを指すようにポインターを設定します。printfこれらの配列から後で (呼び出しのように) 読み取ることはできますが、これらの配列に書き込むことはできません。

または、配列を作成したい場合は、後で次のように書き込むことができます。

#include <stdio.h>
#include <string.h>
int main(int ac, char **av) {
  char x[32]; // make sure this array is big enough!     

  switch(ac) {
  case 0:
    strcpy(x, "0");
    break;
  case 1:
    strcpy(x, "1");
    break;
  default:
    strcpy(x, "NOT 0 nor 1:");
    break;
  }

  strcat(x, ", see?");
  printf("%s\n", x);
  return 0;
}

編集const: 2番目の例から間違ったものを取り除きます。

于 2011-09-07T02:48:11.770 に答える