在c ++中将字符串转换为不带空格的char数组

yas*_*sin 2 c++ string char

在我的代码中,我有char数组,它在这里: char pIPAddress[20]; 我用这个代码从一个字符串设置这个数组:strcpy(pIPAddress,pString.c_str());

这个装载后; 例如,pIPAddress值为"192.168.1.123".但我不想要空间.我需要删除空格.为此,我做到了这一点pIPAddress[13]=0;.

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

日Thnx

Dav*_*eas 5

您可以做的最简单的方法是使用该std::remove_copy算法:

std::string ip = read_ip_address();
char ipchr[20];
*std::remove_copy( ip.begin(), ip.end(), ipchr, ' ' ) = 0; // [1]
Run Code Online (Sandbox Code Playgroud)

接下来的问题是你为什么要这样做,因为最好不要将它复制到数组中,而是从字符串中删除空格然后c_str()用来检索指针......

编辑根据詹姆斯的建议,如果你想删除所有空格而不仅仅是' '角色,你可以使用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]
}
Run Code Online (Sandbox Code Playgroud)

最后一个参数中的可怕演员需要选择一个特定的重载isspace.

[1]所述的*... = 0;需要被添加,以确保字符串的NUL终止.的remove_copyremove_copy_if算法返回一个end输出序列(即,一个超出编辑的最后一个元素)迭代,并且*...=0该迭代器写NUL解除引用.或者,可以在调用算法之前初始化数组,char ip[20] = {};但是\0该数组将写入数组中的所有20个字符,而不是仅写入字符串的末尾.

  • 稍微冗长一点,但我使用`remove_copy_if`和`IsNotSpace`功能对象,它使用标准中的`isspace`函数之一.(一般来说,当一个人想要"删除空格"时,就意味着空格,而不仅仅是空格字符.) (3认同)
  • @DavidRodríguez-dribeas使用来自`<cctype>`的`isspace`不起作用,因为如果它传递的`int`在`[0 ... UCHAR_MAX]`或`EOF范围内,它只有定义的行为`.(实际上,很多实现都会使它与负面字符一起工作.)但是,如果你正在进行任何数量的文本处理,那么你应该做的第一件事就是为所有ctype函数编写简单的函数对象包装器.你会经常使用它们.(我采用`locale`对象,默认为全局对象,并使用`<locale>`中的函数.) (2认同)