在我的代码中,我有char数组,这里是: char pIPAddress[20];
我正在使用以下代码的字符串设置此数组:strcpy(pIPAddress,pString.c_str());
此次装载后;例如,pIPAddress值为“192.168.1.123”。但我不想要空间。我需要删除空格。为此,我做了pIPAddress[13]=0;
。
但如果IP长度机会,它将无法正常工作。我怎样才能计算出节省空间的方式?或其他方式?
日Thnx
答案 0 :(得分:5)
您可以做的最简单的方法是使用std::remove_copy
算法:
std::string ip = read_ip_address();
char ipchr[20];
*std::remove_copy( ip.begin(), ip.end(), ipchr, ' ' ) = 0; // [1]
接下来的问题是你为什么要这样做,因为最好不要将它复制到数组中,而是从字符串中删除空格然后使用c_str()
来检索指针。
编辑根据James的建议,如果您想删除所有空格而不仅仅是' '
字符,则可以将std::remove_copy_if
与仿函数一起使用。我已经测试了直接从std::isspace
标题传递<locale>
并且它似乎有效,但我不确定这对非ascii字符(可能是否定的)不会有问题:
#include <locale>
#include <algorithm>
int main() {
std::string s = get_ip_address();
char ip[20];
*std::remove_copy_if( s.begin(), s.end(), ip, (int (*)(int))std::isspace ) = 0; // [1]
}
最后一个参数中的可怕的强制转换需要选择isspace
的特定重载。
[1] 需要添加*... = 0;
以确保NUL终止字符串。 remove_copy
和remove_copy_if
算法在输出序列中返回一个end
迭代器(即超出最后一个元素编辑的那个),以及用于编写NUL的迭代器的*...=0
解引用。或者,可以在调用算法char ip[20] = {};
之前初始化数组,但是会将\0
写入数组中的所有20个字符,而不是仅写入字符串的末尾。
答案 1 :(得分:0)
我看到你有std::string
。您可以使用erase()
方法:
std::string tmp = pString;
for(std::string::iterator iter = tmp.begin(); iter != tmp.end(); ++iter)
while(iter != tmp.end() && *iter == ' ') iter = tmp.erase(iter);
然后,您可以将tmp
的内容复制到您的char数组中。
请注意,char数组在C ++中完全弃用,除非绝对必须,否则不应使用它们。无论哪种方式,您都应该使用std::string
进行所有字符串操作。
答案 2 :(得分:0)
如果空格仅在字符串的结尾(或开头),则最好使用boost::trim
#include <boost/algorithm/string/trim.hpp>
std::string pString = ...
boost::trim(pString);
strcpy(pIPAddress,pString.c_str());
如果您想手动编码,<cctype>
的功能isspace也有locale specific version。
答案 3 :(得分:-1)
为了使解决方案适用于所有情况,我建议您遍历字符串,并在找到空间时处理它。
更高级别的解决方案可能是您使用允许您自动执行此操作的字符串方法。 (见:http://www.cplusplus.com/reference/string/string/)
答案 4 :(得分:-1)
我想如果你正在使用
的strcpy(pIPAddress,pString.c_str())
然后不需要做任何事情,因为c_str()将a char *返回到以null结尾的字符串。因此,在执行上述操作后,您的char数组'pIPAddress'本身为空终止。因此,如你所说,不需要做任何调整长度的事情。