我不是C程序员.我上周刚刚开始阅读K&R的TCPL.我用Java编写了这个42行代码.我尝试将它转换为C,但它给了我一个分段错误.
这是Java版本:http://codepaste.net/m8jz6m
我尝试将其移植到C的失败:
//Not working.
#include <stdlib.h>
#include <string.h>
void caesar ( const int SIDE )
{
int array [SIDE] [SIDE] ;
for ( int number = 1; number <= SIDE * SIDE; ++ number )
array [ getY ( number, SIDE ) ] [ getX ( number, SIDE ) ] = number ;
for ( int Y = 0; Y < SIDE; ++ Y ) {
for ( int X = 0; X < SIDE; ++ X)
printf ( sprintf ("%%%dd" , strlen(itoa(SIDE*SIDE))), array [Y] [X] );
printf ("\n");
}
}
int getX ( const int number, const int SIDE )
{
return SIDE == 1 ? 0 : number > 4 * SIDE - 4 ? 1 + getX ( number - 4 * SIDE + 4, SIDE - 2 ) : number >= 3 * SIDE - 2 ? 0 : number >= 2 * SIDE - 1 ? 3 * SIDE - 2 - number : number > SIDE ? SIDE - 1 : number - 1 ;
}
int getY ( const int number, const int SIDE )
{
return SIDE == 1 ? 0 : number > 4 * SIDE - 4 ? 1 + getY ( number - 4 * SIDE + 4, SIDE - 2 ) : number >= 3 * SIDE - 2 ? 4 * SIDE - 3 - number : number >= 2 * SIDE - 1 ? SIDE - 1 : number > SIDE ? number - SIDE : 0 ;
}
void main ( int argc, char *argv )
{
if ( argc == 0 )
printf ("\tUsage: java Caesar [side] | side:> Length and breadth of the square.\n");
else
caesar ( atoi( argv[1] ) );
}
void itoa(int n, char s[])
{
int i, sign;
if ((sign = n) < 0) /* record sign */
n = -n; /* make n positive */
i = 0;
do { /* generate digits in reverse order */
s[i++] = n % 10 + '0'; /* get next digit */
} while ((n /= 10) > 0); /* delete it */
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}
/* reverse: reverse string s in place */
void reverse(char s[])
{
int i, j;
char c;
for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
Run Code Online (Sandbox Code Playgroud)
请让我知道我哪里出错了.
你itoa()用一个参数调用你的函数,而函数实际上需要两个参数.
此外,似乎这一行:
array [ getY ( number, SIDE ) ] [ getX ( number, SIDE ) ] = number ;
Run Code Online (Sandbox Code Playgroud)
可以通过以下方式更好地表达:
array[number / SIDE][number % SIDE] = number;
Run Code Online (Sandbox Code Playgroud)
不使用那些getX和getY函数(奇怪的递归).我没有详细检查这些功能,看看它们实际上做了什么,但在任何情况下你都可以考虑上述修改.
sprintf()用不正确的参数调用.第一个参数应该是目标缓冲区.你似乎正在使用它,就像它返回一个字符串(它没有).
查找*printf格式说明符内部的函数.