Как использовать строковые и строковые указатели в C ++ - PullRequest
0 голосов
/ 11 октября 2009

Я очень озадачен тем, когда использовать строку (char) и когда использовать строковые указатели (char pointers) в C ++. Вот два вопроса, которые у меня есть. какой из следующих двух правил правильный?

string subString;
subString = anotherString.sub(9);

string *subString;
subString = &anotherString.sub(9);

какой из следующих двух правил верен?

char doubleQuote = aString[9];
if (doubleQuote == "\"") {...}

char *doubleQuote = &aString[9];
if (doubleQuote == "\"") {...}

Ответы [ 4 ]

4 голосов
/ 11 октября 2009

Ни один из них не является правильным.

Функция-член sub не существует для строки, если вы не используете другой класс string, который не std::string.

Второй из первого вопроса subString = &anotherString.sub(9); небезопасен, так как вы храните временный адрес. Это также неправильно, поскольку anotherString является указателем на строковый объект. Чтобы вызвать функцию-член sub, необходимо написать anotherString->sub(9). И снова, функция-член sub не существует.

Первый из второго вопроса более правильный, чем второй; все, что вам нужно сделать, это заменить "\"" на '\"'.

Второй из второго вопроса не так, как:

  1. doubleQuote относится не к 10-му символу, а к строке, начиная с 10-го символа
  2. doubleQuote == "\"" может быть правильным по типу, но не сравнивает равенство двух строк; он проверяет, указывают ли они на одно и то же. Если вы хотите проверить равенство двух строк, используйте strcmp .
3 голосов
/ 11 октября 2009

В C ++ вы можете (и должны) всегда использовать std::string (помня, что строковые литералы на самом деле являются символьными массивами с нулевым символом в конце). Используйте char* только тогда, когда вам нужно взаимодействовать с кодом C.

Строки в стиле C требуют подверженного ошибкам ручного управления памятью, должны явно копировать строки (копирование указателей не копирует строку), и вам необходимо обратить внимание на такие детали, как выделение достаточного количества памяти для завершения '\0' вписывается, в то время как std::string позаботится обо всем этом автоматически.

0 голосов
/ 11 октября 2009

Эмм, вы используете строку из STL?

(т.е. у вас есть что-то вроде

#include <string>
#using namespace std;

в начале вашего исходного файла;))

тогда это будет похоже на

string mystring("whatever:\"\""");
char anElem = mystring[9];
if (anElem=="\"") { do_something();}

или вы можете написать

mystring.at(9)

вместо квадратных скобок.

Может быть эти примеры могут помочь.

0 голосов
/ 11 октября 2009

Для первого вопроса первый пример, предполагая, что sub вернет подстроку предоставленной строки.

Во-вторых, нет:

char doubleQuote = aString[9];
if( doubleQuote == '\"') { ... }
...