2016-12-02 310 views
0

任务是使用scanf("%d")然后用printf("%с")不一样的atoi标准功能再次打印得到int,itoa。至于我明白我需要把所有的数字再加入\0 char和打印,但是我怎么可以把它。我想到了分割number%10 + /0number/10以减少1个字符的循环。 因此代码看起来应该像平滑这个INT转换为char

#include <conio.h> 
#include <stdio.h> 

main(void) 
{ 
int number,reserve ; 
char Array[50]; 
scanf_s("%d",&number); 
if (number > 0 || number == 0) 
{ 
    do 
    { 
     reserve = number % 10; 
     printf("%c", reserve + '/0'); 
     number /= 10; 
    } while (number != 0); 
} 
else 
{ 
    number *= -1; 
    printf("-"); 
    do 
    { 
     reserve = number % 10; 
     printf("%c", reserve + '/0'); 
     number /= 10; 
    } while (number != 0); 

} 
_getch(); 
return 0; 

}

同样可以有负数,所以我需要一些if语句来检查它是否为负,并且在情况下,它是循环应该避免它,我们不会得到类似-%10

所以我不知道如果循环是正确的(希望有人会解决它并解释我应该如何)。等待你的建议。行

number = number % 10; 

+0

循环控制是错误的:例如,对于'42'你需要'2'循环不'42'。尝试'do {...} while(number!= 0);'。并仔细考虑循环内容。请*运行*您的代码! –

+0

你应该看看[适当的C格式](// prohackr112.tk/r/properties-formatting)。或者学习如何[彻底模糊你的代码](// prohackr112.tk/r/proper-c-obfuscation)。 –

+0

'itoa'不是一个标准功能 –

回答

1

一个副作用是,你失去的number原始值。所以当你去做

number = number/10; 

它总是会得到零值。要解决此问题,请将原始值存储在其他位置,或使用另一个变量进行字符转换(模10,然后加\0)。

此外,您的循环需要重新检查。这个模过程,加上\0,除法,重复,当除法结果为零时(即没有更多的数字要打印)应该停止。另一个需要考虑的问题是:这些数字的印刷顺序是什么?

我会告诉你如何确定int的值是大于还是小于零,因为你没有在这段代码中尝试。

+0

那么我固定错误,当我变得0(欣赏提示),但现在的问题是颠倒的数字。 – andrewand

+0

要反转这个顺序,你可以在一个缓冲区('char'数组)中建立转换后的字符串。或者将其向后(高索引到低索引)进行构建并向前打印(例如使用'printf()'或向前构建它,然后以某种方式向后打印(注意填充,但是)。让我们来看看这些类型的东西,但是我会给你这个想法,并让你弄清楚代码。 – e0k

+0

看看我编辑的问题。现在代码可以处理负数。我知道如何做倒转,但我坚持保存字符以正确排列(不会所有的数字相加)它会是格拉特,如果你能帮助我这个。 – andrewand

0

这会帮助你,通过你的目的

#include <stdio.h> 

int main() { 

    int a; 
    int i = 0; 
    int str_size = 0; 
    char str[11] = {}; 
    char tmp; 

    scanf("%d", &a); 

    while (a) { 
     str[str_size++] = a % 10 + '0'; 
     a /= 10; 
    } 

    str_size--; 

    while (i < str_size) { // rewind 
     tmp = str[i]; 
     str[i++] = str[str_size]; 
     str[str_size--] = tmp; 
    } 
    printf("%s", str); 

    return 0; 
}