0
int myatoi(const char* string) {
int i;
i = 0;
while(*string) {
    i = (i << 3) + (i<<1) + (*string -'0');
    string++;
}
return i;
}

int main() {
int i = myatoi("10101");
printf("%d\n",i);
char a = (char)(((int)'0')+i);
printf("%c\n",a);


return 0;
}

私の出力は10101であることが判明しました

�</p>

これを修正する方法

int を int ごとに解析して char に変換する必要があるのは、変換に役立つ c 組み込み関数を使用できるためです。

4

4 に答える 4

2

何が起こったと思いますか?

コードは文字列"10101"を整数10101に正しく変換し、出力します。それはうまく見えます。10101+(int)'0'次に、おそらく 10149 であると計算します(ASCII または Unicode では(int)'0'48 です)。charそれをおそらくシステム上の印刷可能な文字に対応しない165(またはおそらく-91)に変換すると、空白/ガベージ/欠落した文字が得られます。

すべてが期待どおりです。

于 2012-10-24T17:56:42.187 に答える
0

少し作り直して単純化したバリアント:

unsigned int myatoi(const char* string)
{
  unsigned int i = 0;
  while(*string) i = (i << 3) + (i << 1) + *string++ - 0x30;
  return i;
}

int main()
{
  unsigned int i = myatoi("12133");
  printf("%u\n",i);

  return 0;
}
于 2012-10-24T18:30:31.220 に答える
0

トリック"

printf("%c", '0'+5);

出力を取得する5ための (10 進数の) 数字、つまり 0 ~ 9 に対してのみ機能します。printf("%c", '0'+10)出力を与えます:。なんで?

printf("%c",..)単一の文字を印刷するためのものです。各文字には数値コードがあります ( ASCII コードを参照)。65 は の ASCII コードAなのでprintf("%c", 65)、この文字を与えます。printf("%c", 48)を与えます0。C 言語では'0'の代わりに書くことができる48ので、ASCII コードを覚える必要はありません。C コンパイラは、任意の文字を対応する ASCII コードに変換し''ます""。したがって、上記のコード行は次と同じです

printf("%c", 48+5);

int を文字列表現に変換するには、次のように C で行うことができます。

char repr[12]; // a 32-bit int has at most 10 digits; 
               // +1 for possible sign; +1 for closing 0-character ("null termination")
sprintf(repr, "%d", 10101); // prints the number into a string
itoa(10101, repr, 10); // does the same thing
printf("%s", repr); // prints the string representing the number
printf("%d", 10101); // does the same thing directly
于 2012-10-24T18:32:04.920 に答える
0

char の文字列に 5 桁の数字のみが必要な場合は、次のコードを使用できます。

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

int myatoi(char* string) {
int i;
i = 0;
while(*string) {
    i = (i << 3) + (i<<1) + (*string -'0');
    string++;
}
return i;
}


char *strrev(char *str) {
    char *p1, *p2;
    if (!str || !*str)
        return str;
    for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2) {
        *p1 ^= *p2;
        *p2 ^= *p1;
        *p1 ^= *p2;
    }
    return str;
}


char *itoa(int n, char *s, int b) {
    static char digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
    int i=0, sign;

    if ((sign = n) < 0)
        n = -n;
    do {
        s[i++] = digits[n % b];
    } while ((n /= b) > 0);
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    return strrev(s);
}


int main() {
char buffer[5];
int i = myatoi("10101");

printf("%d\n",i);
itoa(i, buffer, 10);
printf("%s\n",buffer);


return 0;
}

私が使用した 2 つの関数のソース: itoa と strrev
http://www.daniweb.com/software-development/c/threads/11049/convert-int-to-string#

于 2012-10-24T17:55:56.187 に答える