此代码是否适合撤消数字。忽略变量声明。有没有其他方法可以做到这一点?
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;
}
答案 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实现。请注意,在此实现中,尾随零将需要特殊处理,并且这不包含在我的代码中。