扭转C中的数字

时间:2018-06-06 07:17:31

标签: c

此代码是否适合撤消数字。忽略变量声明。有没有其他方法可以做到这一点?

scanf("%d",&n);
int a[n-1];

for(i=0;i<n;i++)
{
    scanf("%d",&a[i]);
}

for(i=0;i<n;i++)
{
    t=a[i];
    while(t!=0)
    {
        last=t%10;
        printf("%d",last);
        t=t/10;
    }
    printf("\n");
}

return 0;
}

3 个答案:

答案 0 :(得分:1)

您提到的未定义行为的代码 for(i=0;i<n;i++) { scanf("%d",&a[i]); }正在扫描数组的n元素,但您只声明a[n-1],即少一个。要克服此问题,请声明a[n]和扫描n元素。

此处您只是反向打印,a[i]不会改变。

答案 1 :(得分:0)

您的代码应该能够反向显示您的号码,但有更简单的方法可以这样做。

在堆中声明一个具有非固定大小的数组(int a[n-1];)是一种有效但尽管很脏的方法。为此,您宁愿使用分配方法作为malloc。

使用scanf同时读取stdin并转换为整数是有吸引力的,但只能在stdin上读取。如果你想阅读其他文件描述符,那么read和atoi的组合会更好。

这是我的做法:

int main() { char buff[128]; int tmp; int *t; if (read(0, buff, 127) <= 0) return (1); if ((tmp = atoi(buff)) < 1) return (1); if ((t = malloc(sizeof(int) * tmp)) == NULL) return (1); for (int i = 0; i < tmp; ++i) { if (read(0, buff, 127) <= 0) return (1); t[i] = atoi(buff); } for (int i = 0; i < tmp; ++i) { while (t > 0) { printf("%d", t % 10); t /= 10; } printf("\n"); } free(t); return (0); }

答案 2 :(得分:0)

您可以将您的数字转换为字符串,然后对字符串使用字符串反转功能,然后将字符串转换回数字。这方面的事情:

int  v = 1234567890;
char cbuf[20];

 sprintf(cbuf,"%d",v);
 strrev(cbuf);
 sscanf(cbuf,"%d",&v);

printf("V = %d\n");

您可以在网络上的某处找到strrev实现。请注意,在此实现中,尾随零将需要特殊处理,并且这不包含在我的代码中。