下面是创建用C编写的小型电子表格的初始框架代码。如果需要的行数少于7行,则工作正常,但如果需要的行数为7行或以上,则行不通。 (它在第7行中创建了多余的列,然后挂起。对深入了解问题的任何帮助都非常感谢
#include <stdio.h>
int main() {
int x = 0, y = 0;
int height, width, *p;
char page[x][y];
char token[] = "** "; /** spaces for formatting **/
printf(" \n Enter number of rows and columns. separated by a space\t" );
scanf("%d %d", &height, &width);
for (y = 0; y < height; y++) {
printf("Row %d\t ", y);
page[x][y] = '\0'; /** prog fails at Row 2 if this line absent **/
for (x = 0; x < width; x++) {
if (y == 0)
printf(" Col %c ", (65 + x)); /** spaces for formatting **/
else {
p = &page[x][y];
*p = token;
printf("%d%c = ", y, (65 + x)); /** prog fails at Row 3 is these printf statements combined **/
printf("%s" , *p);
}
}
printf("\n\n");
}
return 0;
}
答案 0 :(得分:3)
int x = 0, y = 0 ;
char page[x][y] ;
就page
中可用元素的数量而言,您认为这有什么用?您目前对height
和width
变量有何影响?
您当前正在创建一个没有元素的page
(违反约束)。您很幸运(该程序真的很不幸,因为它掩盖了问题),该程序什么都不做。
在分配height
之前,先建立从width
和x
输入到y
和page
的连接。以这种方式创建page
后,就无法调整其大小。
答案 1 :(得分:1)
您想要这个:
int main()
{
int x = 0, y = 0 ;
int height , width, *p ;
char token[] = "** " ; /** spaces for formatting **/
printf(" \n Enter number of rows and columns. separated by a space\t" );
scanf("%d %d", &height , &width);
char page[width][height] ; // allocate width x height chars
在您的解决方案中,您基本上是在这样做:
char page[0][0] ;
分配一个宽度为0且高度为0的二维数组,这并不是真正有用。
访问page[x][y]
将对x
和y
的任何值无限制地访问数组,这将导致未定义行为(谷歌搜索结果)。
答案 2 :(得分:0)
以下的电子表格框架代码可以完美地工作,这要归功于上述的明智贡献。如果愿意,所有人都可以随意使用它作为任何小电子表格问题的基础。如果您希望保持漂亮的格式,则“ width”受行长的限制。但其结构允许在每个单元格中输入数据或公式,并使用指针数组或结构执行计算(并重命名行和列)。
int main()
{
int x = 0 , y = 0 ;
int height , width, *p ;
char token[] = "** " ; /** spaces for formatting **/
printf(" \n Enter number of rows and columns. separated by a space\t" );
scanf("%d %d", &height , &width);
char page[width][height] ;
for(y = 0 ; y < height ; y++ )
{
if(y==0) printf(" ");
else printf("Row %d\t " , y);
for(x= 0 ; x < width ; x++ )
{
if (y == 0)
printf(" Col %c ", (65 + x));
else
{
p = &page[x][y];
*p = token;
printf("%2d%c = %s" , y , (65+x) , *p);
}
}printf("\n\n");
}
return 0;
}