我正在创建一个小函数,它将查看char数组中的char是否为空格。如果是,它将删除该空间。到目前为止,我有:
void clean(char* n, int size){
for (int i = 0; i<size; i++){
if (n[i]==' '){
n[i]= '';
}
}
};
然而,我收到错误:
warning: empty character constant [-Winvalid-pp-token]
我的问题是:如果没有任何库,我怎么能摆脱char数组中的空格。我应该放在这里:
n[i]= ____
谢谢!
答案 0 :(得分:3)
当你找到一个空格时,你需要将其余的字符串向左移动。
所以你需要的代码是(假设空终止字符串)
void clean(char* n) {
for (int from = 0, to = 0; n[from]; ++from) {
if (n[from] != ' ') {
n[to] = n[from];
++to;
}
}
n[to] = 0;
}
这会将字符串复制到自身,沿途删除空格
答案 1 :(得分:3)
不要混淆字符串常量和字符常量:
"h"
是一个包含一个字符的字符串常量,加上一个NULL字符来标记终止。
'h'
是一个字符常量,它是一个字符,不多也不少。
在C ++中""
确实是一个空字符串,但''
是无效的语法,因为一个字符必然有一个值。
从字符串中删除单个字符比这更重要。
如果你有一个像这样的字符串:
"foo bar"
删除空格字符实际上包括将所有后续字符移到左侧。
"foo bar"
^
|
+- bar\0
并且不要忘记同时移动最后一个NULL字符(&#39; \ 0&#39;),以便字符串在&#39; r&#39;之后正确结束。
答案 2 :(得分:0)
如果你还记得C ++标准算法与数组完美配合,那么这个问题最优雅的解决方案是std::remove
。这是一个例子:
#include <algorithm>
#include <iostream>
#include <string.h>
void clean(char* n, int size) {
std::remove(n, n + size, ' ');
}
int main() {
char const* test = "foo bar";
// just some quick and dirty modifiable test data:
char* copy = new char[strlen(test) + 1];
strcpy(copy, test);
clean(copy, strlen(copy) + 1);
std::cout << copy << "\n";
delete[] copy;
}
请注意,该数组实际上并未缩小。如果你需要实际缩小,那么你需要为新数组分配内存,将需求元素复制到它并释放旧内存。
当然,在实际代码中,您不应该首先使用动态数组,而是使用std::string
:
#include <algorithm>
#include <iostream>
#include <string>
void clean(std::string& n) {
n.erase(std::find(n.begin(), n.end(), ' '));
}
int main() {
std::string test = "foo bar";
clean(test);
std::cout << test << "\n";
}