C# 用C从IP地址中删除前导零#

C# 用C从IP地址中删除前导零#,c#,.net,ip-address,C#,.net,Ip Address,我有一个像“127.000.000.001”这样的IP如何删除前导零以得到“127.0.0.1”? 现在我像这样使用正则表达式 Regex.Replace("127.000.000.001", "0*([0-9]+)", "${1}") 没有使用正则表达式,还有其他方法可以实现这个结果吗 我使用visual C#3.0编写这段代码是的,有一种比使用正则表达式更好的方法 相反,试试这个 有一个将以标准符号返回人类可读的IP地址版本的。这可能就是您想要的。IP地址对象将前导零视为八进制,因此不应使

我有一个像“127.000.000.001”这样的IP如何删除前导零以得到“127.0.0.1”? 现在我像这样使用正则表达式

Regex.Replace("127.000.000.001", "0*([0-9]+)", "${1}")

没有使用正则表达式,还有其他方法可以实现这个结果吗


我使用visual C#3.0编写这段代码

是的,有一种比使用正则表达式更好的方法

相反,试试这个


有一个将以标准符号返回人类可读的IP地址版本的。这可能就是您想要的。

IP地址对象将前导零视为八进制,因此不应使用它删除前导零,因为它不会处理192.168.090.009


如@Brent所述,
IPAddress.TryParse
将前导零视为八进制,并将导致错误答案。解决此问题的一种方法是使用进行更换。我个人喜欢这个0后面跟任意数量的数字

Regex.Replace("010.001.100.001", "0*([0-9]+)", "${1}")

它将返回
10.1.100.1
。只有当整个文本是一个IP地址时,这才有效。

您可以在C中使用下面的逻辑写入

#include<stdio.h>
#include<string.h>
#include <arpa/inet.h>

int main(int argc, char** argv)
{
    int inlen=strlen(argv[1])+1, cnt=0, dstcnt=0;
    char dststr[INET_ADDRSTRLEN]="";

    if(argc<2)
    {
        printf("usage: ipvalidator [ip]\n");
        return 0;
    }

    for(cnt=0; cnt<inlen; cnt++)
    {
        if(argv[1][cnt]=='\0')
        {
            break;
        }
        
        if( (argv[1][cnt]=='0') && (argv[1][cnt+1] == '0') &&
            ((cnt==0) ||(argv[1][cnt-1] == '.') || (argv[1][cnt-1] == '0')) )
        {
            continue;
        }
        
        if( (argv[1][cnt]=='0') && (argv[1][cnt+1] >= '1') && 
            (argv[1][cnt+1] <= '9') && 
            ((cnt==0) || (argv[1][cnt-1] == '.') || (argv[1][cnt-1] == '0')) )
        {
            continue;
        }

        dststr[dstcnt++] = argv[1][cnt];

    }
    dststr[dstcnt++] = '\0';

    printf("New IP String: %s\n",dststr);
    return dstcnt;
}
#包括
#包括
#包括
int main(int argc,字符**argv)
{
int inlen=strlen(argv[1])+1,cnt=0,dstcnt=0;
char dststr[INET_ADDRSTRLEN]=“”;

如果(argcI关心Brent的答案。我对IPAddress.Parse有问题。前导零解释为八进制。所以ToString将如何帮助,因为它首先需要一个IPAddress,而要从字符串中生成一个IPAddress,您需要首先解析。不幸的是,这就是这个答案失败的地方。如果IP=172.016.000.000。调用后,这将是错误的ing IPAddress.Parse(IP),结果将是172.14.0.0。这是不正确的。我们应该删除ip地址的前导0。因此,
IPAddress.Parse
方法@Phuc中存在错误。这就是你说的吗?你是否向Microsoft提交了错误报告?使用时会发生什么?你看到相同的行为吗?这被视为八进制。如果我没记错,我看到了这也与构造函数有关。IpAddress确实需要一个ParseExact。请参见下面的答案。@CodyGray,我认为在使用IpAddress.Parse()之前,我们应该删除IpAddress字符串中的前导零。然后,从IpAddress.Parse()返回的结果将始终正确。“有没有其他方法不使用regex来实现此结果?”你没有试图解决提问者的问题。事实上,你已经回答了他们目前如何解决问题。他们要求提供一个替代方案。标签上明确地写着C#,但这是一个C代码。至少将其转换为C#以获得答案