Как правильно назначить char * в c ++? - PullRequest
1 голос
/ 07 сентября 2011

Мой код на C ++ выглядит так:

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

Я не могу понять, как заставить это работать, потому что для первого x = '0'; компилятор жалуется:

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

и для второго x = "1"; компилятор жалуется:

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

Что мне здесь делать? Я поступаю по этому поводу совершенно неправильно?

Ответы [ 6 ]

4 голосов
/ 07 сентября 2011

В case 0 вы пытаетесь установить x в символ (типа char), но в case 1 вы пытаетесь установить x в строку C (типа * 1006)*).Это тип цитат, которые имеют значение;одинарные кавычки предназначены для символов, а двойные кавычки - для строк в стиле C.

Если вы хотите установить его в строку оба раза, поместите двойные кавычки вокруг 0 в x = '0'.

Если вы хотите установить x для символа, используйте одинарные кавычки как раз, так и разыменуйте указатель, например *x, чтобы он стал *x = '0' или *x = '1', или изменить тип x с char* (указатель на символ) на char (символ).Тогда вам не нужно разыменовывать его. 1

Опять же, если вы пытаетесь установить x в строку, было бы лучше использовать строку C ++ вместострока C, с std::string.Затем вы сделаете это с двойными кавычками, такими как строка C, но получите множество дополнительных функций, таких как автоматическое управление памятью, проверка границ и все функции-члены, которые у него есть.

1 Как отметил Николас Гребиль: перед этим убедитесь, что он указывает на действительный char, либо используя new:

char* x = new char;

, либо создав char в стеке:

char c;
char* x = &c;

Важно :

Если вы собираетесь использовать char* с strcat позже (или с любой функцией, ожидающей C-строку), вы должны правильно NULL завершить свой буфер.Так что вам нужно сделать это следующим образом:

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[].

3 голосов
/ 07 сентября 2011

Вопреки распространенному мнению, char* не является строкой. Вместо этого используйте std::string.

#include <string>

std::string x;
switch(i){ 
    case 0:
        x = "0";
    case 1:
        x = "1";
    ...}
2 голосов
/ 07 сентября 2011

Это скорее замечание, что ответ, но вы можете получить символы 0, 1, ... из int с помощью:

char x = '0' + i;

, которая позволит избежать вашего оператора switch0 <= i <= 9 конечно).

2 голосов
/ 07 сентября 2011

Если вы собираетесь использовать символ *, вам нужно выделить место для строки, которая будет сохранена, либо изменив объявление 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.Если вы используете второй пример, вы должны позже:

delete x;

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

1 голос
/ 07 сентября 2011

Сначала, пожалуйста, выясните, как вы можете использовать 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, указывающий на один из трех возможных массивов 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-го примера.

1 голос
/ 07 сентября 2011

Вы объявляете указатель char , не выделяете пробела и затем пытаетесь присвоить ему символ.

char x;

Даст вам переменную типа char

char *x = new char[10]; 

даст вам указатель на 10 байтов памяти, на который указывает указатель на символ.

Как отметил Андре Карон выше, поскольку вы используете c ++, вам действительно нужно использовать реальную строку, чтобы облегчить вашу жизнь

...