我正在学习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),我会收到分段错误错误。为什么呢?
答案 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()
的返回,以确保没有缓冲区溢出。 由于我现在编译了这个,并测试并纠正了它(修正是为了替换递归调用{ {1}} ...bogus...
无效C,你可以告诉我我没有编译过这个,但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