我试图将元素分配给(nXn)字符数组,其末尾为“M”,而剩余的边界为“F”。错误是:
分段错误:核心转储
我的代码是:
#include<stdio.h>
#include<string.h>
int main()
{
int n,i,j;
printf("Enter the size of matrix:\n");
scanf("%d",&n);
char *mat[n][n];
for(i=0;i<n;i++) //Reset matrix
{
for(j=0;j<n;j++)
{
strcpy(mat[i][j],"0");
}
}
for(i=0;i<n;i++) //Diagonals
{
strcpy(mat[i][i],"M");
strcpy(mat[n-1-i][i],"M");
}
for(i=1;i<n-1;i++)
{
strcpy(mat[0][i],"F");//Top border
strcpy(mat[i][0],"F");//Left border
strcpy(mat[i][n-1],"F");//Right border
strcpy(mat[n-1][i],"F");//Bottom border
}
return 0;
}
我是编程新手,并不知道为什么会出现这个错误。有什么建议/帮助吗?
答案 0 :(得分:3)
您没有正确声明您的矩阵,因此您没有使用正确的代码进行设置。
如果你想要一个N×N字符数组,而不是N×N数组的C字符串,你应该声明它没有星号:
char mat[n][n];
现在你可以使用字符常量的简单分配(注释单引号)到mat
的元素,如下所示:
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
mat[i][j] = '0';
}
}
如果你想要一个N×N数组的C字符串,并且这些字符串总是来自字符串文字,你可以使用赋值来代替字符串复制:
char *mat[n][n];
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
mat[i][j] = "0"; // Double quotes are back
}
}
最后,如果你想使用字符串函数,你需要将数组更改为N×N×M,其中M是您希望矩阵保持的最长字符串加上一个用于null终止符的字符串。如果所有字符串都是单个字符,就像它们在您的示例中一样,声明变为
char mat[n][n][2];
答案 1 :(得分:0)
而不是二维数组的字符,你声明了一个指向char的二维指针数组。
char *mat[n][n];
你不应该使用函数strcpy
,因为二维数组不包含字符串。
我认为你的意思是以下
#include <stdio.h>
#include <string.h>
int main(void)
{
size_t n;
printf( "Enter the size of matrix: " );
scanf( "%zu", &n );
char mat[n][n];
memset( mat, '0', n * n );
for ( size_t i = 0; i < n; i++ )
{
mat[i][i] = 'M';
mat[i][n - i - 1] = 'M';
}
for ( size_t i = 1; i < n - 1; i++ )
{
mat[0][i] = 'F';
mat[n-1][i] = 'F';
mat[i][0] = 'F';
mat[i][n-1] = 'F';
}
putchar( '\n' );
for ( size_t i = 0; i < n; i++ )
{
for ( size_t j = 0; j < n; j++ )
{
printf( "%c", mat[i][j] );
}
putchar( '\n' );
}
return 0;
}
程序输出可能看起来如下
Enter the size of matrix: 10
MFFFFFFFFM
FM000000MF
F0M0000M0F
F00M00M00F
F000MM000F
F000MM000F
F00M00M00F
F0M0000M0F
FM000000MF
MFFFFFFFFM
考虑到根据C标准,没有参数的函数main应声明为
int main( void )