1

我正在尝试使用 c_str() 将 C++ 字符串对象转换为 C 风格的 NULL 终止字符串,然后尝试访问单个字符,因为它可以用于 c 风格的字符串。

#include <iostream>
#include <string>

using namespace std;

int main()
{
   string str1("Alpha");
   cout << str1 << endl;

   const char * st = new char [str1.length()+1];
   st = str1.c_str(); // Converts to null terminated string

   const char* ptr=st;

   // Manually Showing each character
   // correctly shows each character

   cout << *ptr << endl;
   ptr++;
   cout << *ptr << endl;
   ptr++;
   cout << *ptr << endl;
   ptr++;
   cout << *ptr << endl;
   ptr++;
   cout << *ptr << endl;
   ptr++;
   cout << "# Null Character :" << *ptr << endl;

   // But below loop does not terminate
   // It does not find '\0' i.e. null

   while( ptr != '\0')
   {
      cout << "*ptr : "<< *ptr << endl;
      ptr++;
   }
   return 0;
}

但似乎它没有在末尾添加 '\0' 并且循环不会终止。我哪里错了?

C 风格的字符串(例如 char* st="Alpha";)可以通过代码中显示的循环访问,但是当从字符串对象转换为 C 风格的字符串时,它不能。我该怎么做?

4

4 回答 4

4
while( ptr != '\0')

应该

while (*ptr != '\0')
于 2013-04-16T11:53:56.403 回答
4

我认为您在这里缺少一个星号:

while( ptr != '\0')

让它

while( *ptr != '\0')

您还可以string像这样访问 a 的每个单独元素:

string helloWorld[2] = {"HELLO", "WORLD"};
char c = helloWorld[0][0];
cout << c;

您还可以遍历 a string

string str ("Hello World");
string::iterator it;
for (int index = 0, it = str.begin() ; it < str.end(); ++it)
   cout << index++ << *it;

或者

string str ("Hello World");
string::iterator it;
for (int index = 0, it = str.begin() ; it < str.end(); ++it, ++index)
   cout << index << *it;

或者

string str ("Hello World");
string::iterator it;
int index = 0;
for (it = str.begin() ; it < str.end(); ++it, ++index)
   cout << index << *it;

了解您正在寻找 C 样式字符串中的空终止字符,但如果您有您的德鲁特人,请继续使用 std::string。

于 2013-04-16T11:53:59.507 回答
4

应该

    while( *ptr != '\0')
        {
            cout << "*ptr : "<< *ptr << endl;
            ptr++;
    }

    const char * st = new char [str1.length()+1];
    st=str1.c_str();//Converts to null terminated String

应该

    char * st = new char [str1.length()+1];
    strcpy(st, str1.c_str());//Copies the characters

或者它可能是

    const char * st = str1.c_str();//Converts to null terminated String

您的版本是两者的错误组合,因为它分配内存就像要复制字符一样,但不会复制任何内容。

您是否意识到您也可以访问 a 的单个字符std::string?只是str1[0],等str1[1]_str1[i]

于 2013-04-16T11:54:16.750 回答
0

这工作正常.. 感谢您的回复。

 int main()
    {
        string str1("Alpha");
            cout << str1 << endl;




        const char * st = new char [str1.length()+1];
            st=str1.c_str();
           //strcpy(st, str1.c_str());//Copies the characters
           //throws error:
           //Test.cpp:19: error: invalid conversion from `const char*' to `char*'
           //Test.cpp:19: error:   initializing argument 1 of `char* strcpy(char*, const char*)'

            const char* ptr=st;


            while( *ptr != '\0')
                {
                    cout << "*ptr : "<< *ptr << endl;
                    ptr++;
            }
        return 0;
        }
于 2013-04-16T12:06:25.393 回答