添加由'分隔的字符串中的数字。 “

时间:2012-08-28 21:09:13

标签: c string

我想编写一个C程序,它会从字符串中的"112.234.456.789"中获取用户的IP地址,并在字符串中添加格式化的输出,例如,"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();
}

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

3 个答案:

答案 0 :(得分:2)

您的代码存在的问题是s[c]!='.'||s[c]!='\0'将为输入中的任何字符评估为true - 甚至是'.'。这意味着i永远不会增加,并且只有每个数字都会归为sum[0],但'.' - 48也是如此。

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

我写了你想要的功能here

#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);
}

顺便说一下,each "block" of the IPv4 address is an octet以及您正在做的是用digit sum替换每个。{/ p>

答案 1 :(得分:1)

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

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

P.S。小心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功能正常运行,请继续执行主要任务。

答案 2 :(得分: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:123.321.456.654的形式输入ip add1 = 123 add2 = 321 add3 = 456 add4 = 654

编辑:你只需要与“添加#”变量一起玩你的数学事物。