2

"112.234.456.789"文字列のようにユーザーからIPアドレスを取得し、文字列の各ブロックに加えて、たとえば"04.09.15.24"上記のIPアドレスに対してフォーマットされた出力を提供するCプログラムを作成したいと思います。これが私がこれまでに持っているものです:

#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であり、それぞれをdigit sumに置き換えています。

于 2012-08-28T21:51:06.307 に答える
1

宿題のように見えるので (この場合は としてタグ付けしてくださいhomework)、いくつかのポイントを示します。

  • fgetsユーザーからの入力を読み取るために使用します。入力を文字列に読み取ります。
  • sscanf文字列を解析するために使用します。4 つの正の整数があることがわかっているので"%u.%u.%u.%u"、書式文字列として使用します。
  • 4 つの整数のそれぞれについて、数字の合計を計算します (先ほど行ったように、10 で割り、10 で余りを使用します)。
  • printfを使用して(または文字列に出力して)フォーマットされた出力をsnprintf印刷します。各合計を 0 で始まる 2 桁の整数としてフォーマットする場合は"%02u"、フォーマット指定子として使用します。

PSsnprintf噛む恐れがありますのでご注意ください。

その他のヒント

一度に 1 つのステップに集中します。分割統治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 に答える