初始化程序无法确定C ++中字符串的大小

时间:2018-09-21 20:44:52

标签: c++

我写了一个程序,用c ++从字符串中删除空格。但是,当我编译该程序时,我遇到了两个错误。它们是error: initializer fails to determine size of ‘str1’error: array must be initialized with a brace-enclosed initializer

任何人都可以告诉我我的代码错误吗?我是C ++的新手。我在下面提到了我的代码

#include <stack>
#include <string>
#include <iostream>
#include <algorithm>

using namespace std;

char *delSpaces(char *str)
{
    int i = 0, j = 0;
    while (str[i])
   {
    if (str[i] != ' ')
       str[j++] = str[i];
    i++;
   }
    str[j] = '\0';
    return str;
}

int main(){
    string s;
    cin >> s;
    char str1[]=s;  
    cout << delSpaces(str1);
}

2 个答案:

答案 0 :(得分:1)

char str1[]=s;  

无效的C ++。

我建议更改您的函数以通过引用接受string参数。

但是,如果您不能这样做,那么从C ++ 11开始,一种对非char const的{​​{1}}缓冲区进行读/写访问的方法是

s

从C ++ 17开始,您还可以使用&s[0]

但是,请注意,您的s.data()在提供的缓冲区中创建了一个以零结尾的字符串,而不了解delSpaces。由于string可以保存任何二进制数据,因此string不会受到对s.length()的调用的影响。您可以通过添加对delSpaces的调用来解决此问题,但是,更好的方法还是用一个s.resize()参数来表示delSpaces

答案 1 :(得分:0)

您无法使用char[]对象初始化std::string缓冲区,这就是为什么会出错的原因。

相反,您将不得不执行以下操作:

char *str1 = new char[s.size()+1];
std::copy(s.begin(), s.end(), str1);
str1[s.size()] = '\0';
std::cout << delSpaces(str1);
delete[] str1;

更好的选择是将delSpaces()函数更改为通过引用使用std::string

void delSpaces(std::string &str) {
    size_t j = 0;
    for (size_t i = 0; i < str.size(); ++i) {
        if (str[i] != ' ')
            str[j++] = str[i];
    }
    str.resize(j);
}

...

std::string s;
std::cin >> s;
delSpaces(s);

您甚至可以让STL为您删除空格字符:

void delSpaces(std::string &str) {
    str.erase(
        std::remove(str.begin(), str.end(), ' '),
        str.end()
    );
}

话虽如此,请注意,默认情况下,当operator>>读取字符数据时,它将忽略前导空格,然后在遇到空格时停止读取,因此在这种情况下使用operator>>将< em>从不返回一个std::string,其中包含空格,因此您的delSpaces()函数几乎没有用。请改用std::getline(),它会读取直到遇到换行符为止,因此可以返回其中包含空格的字符串:

std::getline(std::cin, s);