因此,我必须创建一个程序,当用户插入表格时,该程序只发送表格边界即可。我使用了一个矩阵作为输入,但是当用户结束输入时,程序停止运行并且出现了分段错误。
#include <stdio.h>
#define VAL 50
void inputMatrice(int m[VAL][VAL], int *ncol, int *nrig);
void bordi(int m[][VAL], int ncol, int nrig, int v[], int *nv);
void outputVettore(int v[], int nv);
int main(){
int m[VAL][VAL], v[VAL], *ncol, *nrig, nc, nr, nv;
ncol = &nc;
nrig = &nr;
inputMatrice(m, ncol, nrig);
nv=0;
printf("ciao");
bordi(m, nc, nr, v, &nv);
outputVettore(v, nv);
}
/*Funzione per input matrici*/
void inputMatrice(int m[VAL][VAL], int *ncol, int *nrig){
int i=0, j=0;
printf("Inserisci il numero di righe: ");
scanf("%d", nrig);
printf("Inserisci il numero di colonne: ");
scanf("%d", ncol);
for(i=0;i<*nrig;i++){
for(j=0;j<*ncol;j++){
printf("Inserisci i valori della tabella nella posizione %d,%d: ", i+1, j+1);
scanf("%d", &m[i][j]);
}
}
}
void bordi(int m[][VAL], int ncol, int nrig, int v[], int *nv){
int i=0, j=0, k=0;
for(j=1; j<ncol; j++){
v[k]=m[i][j];
*nv++;
}
for(i=1;i<nrig;i++){
v[k] = m[i][j];
*nv++;
}
for(j=(ncol-1); j>0; j++){
v[k]=m[i][j];
*nv++;
}
for(i=(nrig-1); j>0; i++){
v[k]=m[i][j];
*nv++;
}
}
void outputVettore(int v[], int nv){
int i=0;
for(i=0;i<nv;i++){
printf("|%d|", v[i]);
}
}
抱歉,意大利语的输出和英语不好。
答案 0 :(得分:0)
程序*nv++;
中的行会增加指针,这在逻辑上是完全错误的,请尝试增加value。
也就是说,尝试:-
(*nv)++;
答案 1 :(得分:0)
错误发生在
void bordi(int m[][VAL], int ncol, int nrig, int v[], int *nv)
功能。
修复第3和第4 for
个循环条件。您在第一个循环中将j
递增了,但没有递减或将其设置为0,因此您会遇到无限循环。
答案 2 :(得分:0)
问题出在功能bordi()
中。看一下这个for
循环:
for(j=(ncol-1); j>0; j++){
v[k]=m[i][j];
*nv++;
}
循环控制变量j
用ncol-1
初始化并检查条件j>0
。执行循环语句后,j
将增加1
(j++
)。因此循环条件j>0
将始终true
[直到j
溢出] ,经过几次迭代,您的程序开始访问数组m
的无效值(m[i][j]
)导致分段错误。
要解决此问题,请在循环中将j++
替换为j--
。
下一个for
循环中也存在相同的问题,但方式略有不同:
for(i=(nrig-1); j>0; i++){
v[k]=m[i][j];
*nv++;
}
在这里,在循环条件下,您正在使用变量j
。
您需要在此for
循环中进行两次更改。
for(i=(nrig-1); i>0; i--){
^^ ^^