初始值设定项无法确定 C++ 中字符串的大小
initializer fails to determine size of string in 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] = ' ';
return str;
}
int main(){
string s;
cin >> s;
char str1[]=s;
cout << delSpaces(str1);
}
char str1[]=s;
C++无效。
我建议更改您的函数以通过引用获取string
参数。
但是,如果您不能做到这一点,那么从 C++11 开始,获得对非const
s
char
缓冲区的读/写访问权限的一种方法是
&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);