在我的代码中,我有char数组,在这里是: char pIPAddress[20]; 我从具有以下代码的字符串设置此数组:strcpy(pIPAddress,pString.c_str());
加载后;例如,pIPAddress值为“192.168.1.123”。但是我不要空格。我需要删除空格。为此,我做了这个pIPAddress[13]=0;

但是,如果IP长度有机会,它将无法正常工作。我怎样才能计算出节省空间的方式?还是其他方式?

n

最佳答案

您可以做的最简单的方法是使用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 header 传递<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_copyremove_copy_if算法在输出序列中返回一个end迭代器(即,超出最后一个编辑元素的迭代器),并且*...=0取消引用该迭代器以编写NUL。另外,可以在调用算法char ip[20] = {};之前初始化数组,但是它将\0写入数组中的所有20个字符,而不仅仅是写入字符串的末尾。

关于c++ - 在C++中将字符串转换为不带空格的char数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8078048/

10-11 23:19
查看更多