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)。将其转换为 achar可能会给您 165(或可能 -91),这可能与您系统上的可打印字符不对应,因此您会得到一个空白/垃圾/缺失字符。

一切如预期。

于 2012-10-24T17:56:42.187 回答
0

如果您只需要一个 5 位数字到 char 字符串中,您可以使用以下代码:

#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 回答
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仅适用于(十进制)数字,即 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 代码之间''""转换为相应的 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 回答