用C写这段Java?

Ang*_*gad 1 c java

我不是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)

请让我知道我哪里出错了.

Gre*_*ill 6

  • 你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格式说明符内部的函数.