初始值设定项无法确定 C++ 中字符串的大小

initializer fails to determine size of string in C++

本文关键字:字符串 C++ 无法确定      更新时间:2023-10-16

我用 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] = '';
return str;
}
int main(){
string s;
cin >> s;
char str1[]=s;  
cout << delSpaces(str1);
}
char str1[]=s;  

C++无效。

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

但是,如果您不能做到这一点,那么从 C++11 开始,获得对非constschar缓冲区的读/写访问权限的一种方法是

&s[0]

从 C++17 开始,您还可以使用s.data().

但是,请注意,您的delSpaces会在提供的缓冲区中创建以零结尾的字符串,而不知道有关string的任何信息。由于string可以保存任何二进制数据,因此s.length()不受调用delSpaces的影响。您可以通过添加对s.resize()的调用来解决此问题,但同样,更好的方法是使用string&参数表达delSpaces

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

你将不得不做更多类似的事情:

char *str1 = new char[s.size()+1];
std::copy(s.begin(), s.end(), str1);
str1[s.size()] = '';
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>>永远不会返回包含空格的std::string,因此您的delSpaces()函数非常有用,如图所示。 改用std::getline(),它会读取直到遇到换行符,因此可以返回包含空格的字符串:

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