2

我想编写一个 C 程序,它将像字符串一样从用户那里获取一个 IP 地址,"112.234.456.789"并在字符串中的每个块之外提供格式化输出,例如,"04.09.15.24"对于上述 IP 地址。这是我到目前为止所拥有的:

#include<stdio.h>
#include<string.h>
#include<conio.h>

main()
{
    char s[15],d[11];
    int i=0,c = 0, sum[4] = {0};

    d[i]=sum[c]/10;
    printf("Enter ip address:");
    gets(s);
    printf("\n \n %s",s);
    i=0;
    for(c=0;c<15;c++)
    {
        if(s[c]!='.'||s[c]!='\0')
            sum[i]=(s[c]-48)+sum[i];
        else
            i++;
    }

    for(i=0,c=0;c<4;c++,i+=3)
    {
        d[i]=(sum[c]/10)+48;
        d[i+1]=sum[c]%10+48;
        d[i+2]='.';
    }
    printf("\n \n %s",d);
    getch();
}

输入应该是 IP 地址,例如"112.234.546.234",输出应该是每个块中添加数字的结果,"04.09.15.06"。输入和输出应该是字符串。

4

3 回答 3

2

您的代码的问题是,它将为输入中的任何s[c]!='.'||s[c]!='\0'字符评估 true - 甚至. 这意味着永远不会增加,并且不仅每个数字都与 相加,而且 也是。'.'isum[0]'.' - 48

你的意思是s[c] != '.' && s[c] != '\0'

我在这里写了你想要的功能。

#include <stdio.h>
#include <ctype.h>

void convert(const char *in, char *out) {
  unsigned int sum = 0;
  char ch;
  do {
    ch = *in++;
    if (isdigit(ch)) {
      sum += ch - '0';
    } else {
      *out++ = sum / 10 + '0';
      *out++ = sum % 10 + '0';
      if (ch == '.') {
        *out++ = '.';
        sum = 0;
      }
    }
  } while (ch);
}

顺便说一句,IPv4 地址的每个“块”都是一个octet,而您正在做的是将每个“块”替换为其数字 sum

于 2012-08-28T21:51:06.307 回答
1

它看起来像家庭作业(如果是这种情况,请将其标记为homework),所以我将给出一些指示:

  • 用于fgets读取用户的输入。将输入读入字符串。
  • 用于sscanf解析字符串。由于您知道将有四个正整数,因此请"%u.%u.%u.%u"用作格式字符串。
  • 对于四个整数中的每一个,计算数字的总和(使用除以 10 和余数除以 10,就像你刚才所做的那样)。
  • printf使用(或snprintf打印到字符串)打印格式化的输出。如果您希望将每个总和格式化为两位整数,前导 0,请"%02u"用作格式说明符。

PS小心snprintf,它可能会咬人。

其他提示

一次专注于一个步骤。分而治之。编写一个digit_sum函数,将整数作为参数,计算其数字的总和:

unsigned int digit_sum(unsigned int n)
{
    unsigned int sum = 0;

    while (n > 0) {
        sum += n % 10;
        n /= 10;
    }

    return sum;
}

一旦您的digit_sum功能运行良好,请继续执行主要任务。

于 2012-08-28T21:26:01.833 回答
1

我只是为您编写了一个如何“丢弃”不需要的字符的简单示例。

#include <studio.h>

    main ()
    {
        int add1, add2, add3, add4;

        printf("enter an ip in the form xxx.xxx.xxx.xxx: )";
        scanf("%d%*c%d%*c%d%*c%d", &add1, &add2, &add3, &add4);
        printf("add1 = %d add2 = %d add3 = %d add4 = %d\n\n", add1, add2, add3, add4);

        return 0;
    }

控制台输出:

输入 xxx.xxx.xxx.xxx 形式的 ip:123.321.456.654
add1 = 123 add2 = 321 add3 = 456 add4 = 654

编辑:您只需要使用“add#”变量来完成您的数学运算。

于 2012-08-28T22:16:57.430 回答