String的去0操作

当前读到的值为12.02.00.001,需要做去0操作使得值变为12.2.0.1
如果用遍历去0结果就会变成12.2..1
好兄弟这个如何解决呀

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/735675
  • 这篇博客也不错, 你可以看下实验5.4 编程实现两字符串的连接(使用string类定义字符串对象)
  • 除此之外, 这篇博客: string类常见题目详解(二)—— 把字符串转换成整数、反转字符串中的 题目一:把字符串转换成整数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 题目描述:
     将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。数值为0或者字符串不是一个合法的数值则返回0。输入的字符串包括数字字母符号,可以为空。

    示例:
     输入:"+2147483647"
     输出:“2147483647”

    分析:
     字符串当中可能包含数字、字母和其他符号,正数可以在前面放上正号,由此可以确定的是,一个字符串一个合法的数值,则除了其第一个字符可能是正号或负号以外,其他字符都应该是数字字符。

    步骤:
     1、先判断除第一个字符以外的字符,若是其中出现了非数字字符的字符,则该字符串非法,否则我们计算出其转换为整数后的数值。
     2、再判断第一个字符,若是正号,则当前整数的正值;若是负号,则返回当前整数的负值;若还是数字字符,则再次更新当前整数的数值并返回;若第一个字符不属于这三种情况,则说明该字符串还是非法的。

    代码:

    class Solution {
    public:
    	int StrToInt(string str) {
            if (str.size() == 0) //空字符串,返回0
    			return 0;
    		int start = 0; //头指针指向第一个字符
    		int end = str.size() - 1; //尾指针指向最后一个字符
    		int ret = 0; //字符串转换为整数后的结果
    		int i = 1; //标识十进制当前位的权重(当前为个位,权重为1)
    		while (start < end) //判断第一个字符之后的字符
    		{
    			if (str[end] < '0' || str[end] > '9') //若不是数字,则非法
    			{
    				return 0;
    			}
    			ret += i*(str[end] - '0'); //ret更新
    			i *= 10; //下一位权重增大十倍
    			end--; //继续判断
    		}
    		//判断第一个字符
    		if (str[end] >= '0' && str[end] <= '9') //是数字
    			return ret + i*(str[end] - '0'); //再次更新ret并返回正值
    		if (str[end] == '+') //标识正数
    			return ret; //返回正值
    		if (str[end] == '-') //标识负数
    			return -ret; //返回负值
    		return 0; //第一个字符不是数字、+、-当中的一个,则还是非法
    	}
    };
    
  • 以下回答由chatgpt基于相关博客总结生成:

    可以使用字符串的split方法将原字符串按"."进行分割,然后逐个处理每个分割出来的字符串,去掉前面的"0",再将处理后的字符串拼接成新的字符串即可。代码示例如下:

    def remove_zero(s):
        # 按"."进行分割
        lst = s.split('.')
        # 处理每个分割出来的字符串
        for i in range(len(lst)):
            if lst[i].startswith('0'):
                # 去掉前面的"0"
                lst[i] = str(int(lst[i]))
        # 拼接处理后的字符串
        return '.'.join(lst)
    
    s = '12.02.00.001'
    print(remove_zero(s))  # 输出 12.2.0.1
    

    另外,由于此处的字符串处理较为简单,也可以使用正则表达式进行匹配和替换操作,代码示例如下:

    import re
    
    def remove_zero(s):
        # 使用正则表达式进行匹配和替换操作
        return re.sub(r'\b0+(\d)', r'\1', s)
    
    s = '12.02.00.001'
    print(remove_zero(s))  # 输出 12.2.0.1
    

    上述正则表达式\b0+(\d)表示匹配以单词边界开头,后面跟着1个或多个0,然后是1个数字的情况,将匹配到的0替换为空字符串,从而达到去除0的效果。

按 【.】分割替换0为空字符串,再加个判断如果替换后整个字符串变空了,则补个0

遍历也可以实现去0,重点是如何判断当前这个0是否需要去掉,所以可以考虑将字符串按照“.”进行分割来去0。只需要判断被分割的字符串长度及是否是0即可,参考如下

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string input = "12.02.00.001";
    string output = "";
    string delimiter = ".";

    size_t pos = 0;
    string token;
    //进行字符串分割
    while ((pos = input.find(delimiter)) != string::npos) {
        token = input.substr(0, pos);
        if (token.size() > 1 && token[0] == '0') {
            token = token.substr(1);
        }
        output += token + delimiter;
        input.erase(0, pos + delimiter.length());
    }
    if (input.size() > 1 && input[0] == '0') {
        input = input.substr(1);
    }
    output += input;
    cout << output << endl;

    return 0;
}

希望能帮到你,加油~~~

按点号分割字符串转int再拼起来,转int失败就直接为0