C中的钙细胞转化器

时间:2011-10-04 16:56:50

标签: c segmentation-fault

我正在学习C,我写了一个简单的程序(只是晒黑)。在输入时,您传递两个参数(行和列)并输出您获得此单元格的Calc(或Excel)代码。 例如:

Input: 3 1     Output: A3
Input: 1 27    Output: AA1

代码:

#include <stdio.h>

char kol[7] = "";
unsigned int passes=0, nr;

int powa(unsigned int lv)
{
  if(passes < nr)
  {
    if(kol[lv] == '\0')
    {
      kol[lv] = 'A';
      kol[lv+1] = '\0';
    } else
    {
      kol[lv]++;
      if(kol[lv] == 'Z'+1)
      {
        kol[lv] = 'A';
        powa(lv+1);
        return 0;
      }

    }
    passes++;
    if(lv != 0)
    {
      powa(lv-1);
    } else
    {
      powa(lv);
    }

  }
}

int main(void)
{
  unsigned int wier;
  int i, len=0;
  scanf("%u %u", &wier, &nr);
  powa(0);
  while(kol[len] != '\0')
  {
    len++;
  }

  for(i=len-1;i>=0;i--)
  {
    putchar(kol[i]);
  }
  printf("%u", wier);
  return 0; 
}

但是如果我传入更大的值(例如300000000),我会收到分段错误错误。为什么呢?

2 个答案:

答案 0 :(得分:2)

您只为kol分配了7个字节。你试图超越数组的界限。

答案 1 :(得分:1)

你在尝试递归吗?我不认为我会使用递归解决方案。您可能不应该使用尽可能多的全局变量。

假设递归是至关重要的,那么在概述中,我想我会期望使用如下的解决方案:

char *powa(unsigned int code, char *buffer)
{
    unsigned int div = code / 26;
    unsigned int rem = code % 26;
    if (div > 0)
        buffer = powa(div - 1, buffer);
    *buffer++ = rem + 'A';
    *buffer = '\0';
    return buffer;
}

int main(void)
{
    char buffer[32];
    unsigned int col, row;

    printf("Enter column and row numbers: ");
    if (scanf("%u %u", &col, &row) == 2)
    {
        if (col == 0 || row == 0)
            fprintf(stderr, "Both row and column must be larger than zero"
                            " (row = %u, col = %u)\n", row, col);
        else
        {
            char *end = powa(col-1, buffer);
            snprintf(end, sizeof(buffer) - (end - buffer), "%u", row);
            printf("Col %u, Row %u, Cell %s\n", col, row, buffer);
        }
    }
    return 0;
}

请注意,修订后的powa()会在其格式化的数据末尾返回指向null的指针。从理论上讲,我应该检查snprintf()的返回,以确保没有缓冲区溢出。 由于...bogus...无效C,你可以告诉我我没有编译过这个,但我现在编译了这个,并测试并纠正了它(修正是为了替换递归调用{ {1}} powa(div, buffer),需要进行更改,因为计算需要处理0和1作为计数的起点。递归方案对我来说似乎更简单(一个递归调用而不是其中三个)码)。

powa(div - 1, buffer)

以下是处理从上述代码派生的扫描和格式的代码:

Enter column and row numbers: 13 27
Col 13, Row 27, Cell M27

Enter column and row numbers: 27 13
Col 27, Row 13, Cell AA13

Enter column and row numbers: 30000000 128
Col 30000000, Row 128, Cell BMPVRD128

Enter column and row numbers: 300000000 128
Col 300000000, Row 128, Cell YFLRYN128