我写了一个程序,用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);
}
答案 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);