0

我正在尝试编写一个将字符串存储在数组中的代码。我正在尝试使用 char* 来实现,但我无法实现。我在网上搜索但找不到答案。我已经尝试了下面的代码,但它没有编译。我使用字符串流,因为在某些时候我需要将一个字符串与一个整数连接起来。

stringstream asd;
asd<<"my name is"<<5;
string s = asd.str();
char *s1 = s;
4

5 回答 5

5

> 我正在尝试编写一个将字符串存储在数组中的代码。

好吧,首先你需要一个字符串数组。我不喜欢使用裸数组,所以我使用std::vector

std::vector<std::string> myStrings;

但是,我知道您必须使用数组,所以我们将使用数组:

// I hope 20 is enough, but not too many.
std::string myStrings[20];
int j = 0;

> 我使用字符串流,因为...

好的,我们将使用字符串流:

std::stringstream s;
s << "Hello, Agent " << 99;
//myStrings.push_back(s.str()); // How *I* would have done it.
myStrings[j++] = s.str(); // How *you* have to do it.

这给了我们一个字符串,但你想要一个它们的数组:

for(int i = 3; i < 11; i+=2) {
  s.str(""); // clear out old value
  s << i << " is a" << (i==9?" very ":"n ") << "odd prime.";
  //myStrings.push_back(s.str());
  myStrings[j++] = s.str();
}

现在你有一个字符串数组。

完整、经过测试的程序:

#include <sstream>
#include <iostream>

int main () {
  // I hope 20 is enough, but not too many.
  std::string myStrings[20];
  int j = 0;

  std::stringstream s;
  s << "Hello, Agent " << 99;
  //myStrings.push_back(s.str()); // How *I* would have done it.
  myStrings[j++] = s.str(); // How *you* have to do it.

  for(int i = 3; i < 11; i+=2) {
    s.str(""); // clear out old value
    s << i << " is a" << (i==9?" very ":"n ") << "odd prime.";
    //myStrings.push_back(s.str());
    myStrings[j++] = s.str();
  }

  // Now we have an array of strings, what to do with them?
  // Let's print them.
  for(j = 0; j < 5; j++) {
    std::cout << myStrings[j] << "\n";
  }
}
于 2012-04-07T20:50:04.067 回答
2

这样的事情怎么样?

vector<string> string_array;
stringstream asd;
asd<<"my name is"<<5;
string_array.push_back(asd.str());
于 2012-04-07T20:47:29.993 回答
1
char *s1 = s;

是非法的。您要么需要:

const char *s1 = s.c_str();

如果您没有设置 on char*,或者您需要分配一个新的char*并用于strcpy从字符串中复制内容。

于 2012-04-07T20:46:38.640 回答
0

只需将您的代码更改为

char const* s1 = s.c_str();

因为指向 char 的指针不能存储字符串对象,只能存储指向 char 的指针,这就是 c_str() 返回的内容。

于 2012-04-07T20:46:58.850 回答
0

我不会直接使用 char * 。我会将它包装在类似下面的模板中。您可以覆盖您需要执行更多操作的运算符(例如,我会将数据设为私有成员,并覆盖运算符以使数据打印出来干净)。我做了赋值运算符只是为了演示代码的简洁程度。

#include "MainWindow.h"

#include <stdio.h>

using namespace std;

template<size_t size>
class SaferChar
{
public:

  SaferChar & operator=(string const & other)
  {
    strncpy(data, other.c_str(), size);

    return *this;
  }

  char data[size];
};

int main(int argc, char *argv[])
{
  SaferChar<10> safeChar;
  std::string String("Testing");


  safeChar = String.c_str();

  printf("%s\n", safeChar.data);

  return 0;
}
于 2012-04-07T21:19:10.040 回答