java - 用C写Java这段?

标签 java c

我不是 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;
     }
 }

请让我知道哪里出错了。

最佳答案

  • 您正在用一个参数调用您的 itoa() 函数,而该函数实际上需要两个参数。

  • 此外,似乎这一行:

    array [ getY ( number, SIDE ) ] [ getX ( number, SIDE ) ] = number ;
    

    可以用这样的方式更好地表达:

    array[number / SIDE][number % SIDE] = number;
    

    不使用那些 getXgetY 函数(奇怪的是递归的)。我没有详细检查这些功能以了解它们实际做了什么,但您可以考虑在任何情况下进行上述修改。

  • sprintf() 使用不正确的参数调用。第一个参数应该是目标缓冲区。您似乎在使用它,就好像它返回了一个字符串(它没有)。

  • 在 printf 格式说明符中查找 * 的函数。

关于java - 用C写Java这段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3334736/

相关文章:

c - glReadPixels()无法获取片段着色器输出的A值。

java - 如何从 logback 中的 Java 堆栈跟踪中删除换行符?

c - 我的代码逻辑哪里错了?

java - 将特征重要性 vector 压缩到列名称数组时出现 Scala java.io toArray 错误

java - 如何使用 Java Date 类将验证添加到进入另一年的日期

c - 通过创建MPI驱动的数据类型来发送包含void *的typedef结构。

c - 标记结构初始化、函数及其参数

c - 新的 Mongo C 驱动程序中是否有相当于 mongo_find_one() 的函数

java - Java中将一串数字转换为数组,其中每个数字都是不同的槽

java - 无法序列化