3

これは、2 つの文字列型 integer を追加する私のプログラムのサンプル コードです(ex: "23568" and "23674")charだから、私は単一の追加で試していました。

char first ='2';
char second ='1';

私はこのようにしようとしていた..

i=((int)first)+((int)second);
printf("%d",i);

そして、出力99を取得しています。これは、両方のASCII値を追加しているためです。誰でも私に提案してください、 Cに char 型番号を追加するアプローチはどうあるべきですか。

4

8 に答える 8

9

あなたの例には2つの単一文字が一緒に追加されているため、2つのことを確信できます

  1. 合計が 18 を超えることはありません。
  2. ライブラリ呼び出しによる変換を完全に回避できます。標準では、'0' から '9' までが連続していることを要求しています (実際、標準で義務付けられている文字シーケンスはこれだけです)。

したがって;

char a = '2';
char b = '3';

int i = (int)(a-'0') + (int)(b-'0');

常に機能します。EBCDIC でも (それが何かわからない場合は、幸運だと考えてください)。

現在文字列形式 ("12345"、"54321") になっている複数の数字の 2 つの数字を実際に加算する場合は、strtol()が最良の代替手段です。

于 2012-11-12T13:29:30.957 に答える
5
i=(first-'0')+(second-'0');

No need for casting char to int.

于 2012-11-12T13:23:46.893 に答える
1

質問は面白そうでしたが、「文字列番号」を追加するのは少し難しいです(私が使用した醜いアプローチではさらに)。

このコードは、任意の長さの 2 つの文字列を追加します。後ろから追加を開始するため、同じ長さである必要はありません。十分な長さのバッファである両方の文字列を提供し、文字列に数字のみが含まれていることを確認します。

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

char * add_string_numbers(char * first, char * second, char * dest, int dest_len)
{
    char * res = dest + dest_len - 1;
    *res = 0;

    if ( ! *first && ! *second )
    {
        puts("Those numbers are less than nothing");
        return 0;
    }

    int first_len = strlen(first);
    int second_len = strlen(second);

    if ( ((first_len+2) > dest_len) || ((second_len+2) > dest_len) )
    {
        puts("Possibly not enough space on destination buffer");
        return 0;
    }

    char *first_back = first+first_len;
    char *second_back = second+second_len;

    char sum;
    char carry = 0;

    while ( (first_back > first) || (second_back > second) )
    {
        sum = ((first_back  > first)  ? *(--first_back) : '0')
            + ((second_back > second) ? *(--second_back) : '0')
            + carry - '0';

        carry = sum > '9';
        if ( carry )
        {
            sum -= 10;
        }

        if ( sum > '9' )
        {
            sum = '0';
            carry = 1;
        }

        *(--res) = sum;
    }

    if ( carry )
    {
        *(--res) = '1';
    }

    return res;
}

int main(int argc, char** argv)
{
    char * a =              "555555555555555555555555555555555555555555555555555555555555555";
    char * b = "9999999999999666666666666666666666666666666666666666666666666666666666666666";
    char r[100] = {0};

    char * res = add_string_numbers(a,b,r,sizeof(r));

    printf("%s + %s = %s", a, b, res);

    return (0);
}
于 2012-11-12T14:34:07.747 に答える
1

文字の数表現を追加する場合は、「(first - '0') + (second - '0');」を使用します。

于 2012-11-12T13:28:44.747 に答える
0

ええと...あなたすでにchar型を追加しています.49 10と50 10で、99 10になるはずです.

2 つの文字の reperserented 値を追加する方法を尋ねている場合、つまり'1' + '2' == 3base を減算できます'0'

printf("%d",('2'-'0') + ('1'-'0')); 

次の理由により、int として 3 が得られます。

'0' = ASCII 48<sub>10</sub>
'1' = ASCII 49<sub>10</sub>
'2' = ASCII 50<sub>10</sub>

だからあなたはやっている:

printf("%d",(50-48) + (49-48));

より長い数を実行したい場合は、atoi()を使用できますが、その時点で文字列を使用する必要があります。

int * first = "123";
int * second = "100";
printf("%d", atoi(first) + atoi(second));

>> 223
于 2012-11-12T13:30:27.947 に答える
0

実際、単一の でこれを行うために文字を型キャストする必要さえありませんchar:

 #include <stdlib.h>
 #include <stdio.h>
 int main(int argc, char* argv[]) {
     char f1 = '9';
     char f2 = '7';
     int v = (f1 - '0') - (f2 - '0');
     printf("%d\n", v);

     return 0;
 }

印刷します2

ただし、注意してください。16 進文字では機能しません。

于 2012-11-12T13:37:10.607 に答える
-1

数字ごとにスキャンしたい場合は、単純なatoi関数で実行できます

于 2012-11-12T13:27:29.267 に答える
-2

atoi() 関数を使用できます

#include <stdio.h>
#include <stdlib.h>
void main(){
    char f[] = {"1"};
    char s[] = {"2"};
    int i, k;
    i = atoi(f);
    k = atoi(s);
    printf("%d", i + k);
    getchar();
}

私はあなたの質問に答えたことを願っています

于 2012-11-12T13:33:05.907 に答える