积极答复者
指针错误?谁能帮我看看

问题
-
下面代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { ///////////////////////////////////////////////////////////////////////////////////////////////////定义声明部分 void sortup(char zyao[20][2][8],int counto); void sortdown(char zyao[20][2][8],int counto); int findserialnumber(char zyao[20][2][8],char nameo[8],int counto); int findname(char zyao[20][2][8],char sno[8],int counto); char zyai[20][2][8]; int i,j,k; int counti=0,countni=0,countsi=0; char namei[8],sni[8],result[8]; ///////////////////////////////////////////////////////////////////////////////////////////////////赋初值部分 for (i=0;i<20;i++) { for (j=0;j<2;j++) { for (k=0;k<8;k++) { zyai[i][j][k] = '\/'; } } } for (i=0;i<8;i++) { namei[i] = '\/'; } for (i=0;i<8;i++) { sni[i] = '\/'; } ///////////////////////////////////////////////////////////////////////////////////////////////////输入数据部分 printf("input serial number and name value(format: xxx xxx ...^):\n"); for (i=0;i<20;i++)//输入进行操作的数据各个元素 { for (j=0;j<2;j++) { for (k=0;k<8;k++) { scanf("%c",&zyai[i][j][k]); if (zyai[i][j][k]==' ') { zyai[i][j][k] = '\/'; counti = counti+1; break; } if (zyai[i][j][k]=='\^') { zyai[i][j][k] = '\/'; i = j = k = 20; } } } } printf("input serial number value:"); for (i=0;i<8;i++) { scanf("%c",&sni[i]); if (sni[i]==' ') { sni[i] = '\/'; break; } if (sni[i]!=' ') { countsi = countsi+1; } } printf("input name value:"); for (i=0;i<8;i++) { scanf("%c",&namei[i]); if (namei[i]==' ') { namei[i] = '\/'; break; } if (namei[i]!=' ') { countni = countni+1; } } ///////////////////////////////////////////////////////////////////////////////////////////////////执行命令部分 printf("option 1:sort up\n"); printf("option 2:sort down\n"); printf("option 3:find name value with serial number\n"); printf("option 4:find serial number value with name\n"); printf("please enter option value:"); if (getchar()=='1') { sortup(zyai,counti); } if (getchar()=='2') { sortdown(zyai,counti); } if (getchar()=='3') { int fsn; fsn = findname(zyai,sni,counti); for (k=0;k<countsi;k++) { printf("%c",zyai[fsn][1][k]); if (zyai[fsn][1][k]=='\/') { printf("\n"); break; } } } if (getchar()=='4') { int fdn; fdn = findserialnumber(zyai,sni,counti); for (k=0;k<countsi;k++) { printf("%c",zyai[fdn][0][k]); if (zyai[fdn][0][k]=='\/') { printf("\n"); break; } } } system("pause"); return 0; } void sortup(char zyao[20][2][8],int counto) { void maopao(char zyao[20][2][8],int counto); int findmaxdigit(char zyao[20][2][8],int i); int i,j,k,fmd; for (i=0,j=0;i<counto/2;i++) { for (k=7;k>=0;k--) { if (zyao[i][j][k]!='\/') { fmd = findmaxdigit(zyao,i); zyao[i][j][k] = zyao[i][j][(fmd--)-1]; if (fmd<0) { zyao[i][j][k] = '\/'; } } } } maopao(zyao,counto); } void sortdown(char zyao[20][2][8],int counto) { void paixu(char zyao[20][2][8],int counto); int findmaxdigit(char zyao[20][2][8],int i); int i,j,k,fmd; for (i=0,j=0;i<counto/2;i++) { for (k=7;k>=0;k--) { if (zyao[i][j][k]!='\/') { fmd = findmaxdigit(zyao,i); zyao[i][j][k] = zyao[i][j][(fmd--)-1]; if (fmd<0) { zyao[i][j][k] = '\/'; } } } } paixu(zyao,counto); } int findserialnumber(char zyao[20][2][8],char nameo[8],int counto) { int i,j,k; int fsn; for (i=0;i<counto/2;i++) { if (strcmp(nameo,zyao[i][1])==1) { fsn = i; } } return fsn; } int findname(char zyao[20][2][8],char sno[8],int counto) { int i,j,k; int fdn; for (i=0;i<counto/2;i++) { if (strcmp(sno,zyao[i][0])==1) { fdn = i; } } return fdn; } int findmaxdigit(char zyao[20][2][8],int i) { int k; int maxdigit[20]; maxdigit[i] = 0; for (k=0;k<8;k++) { if (zyao[i][0][k]!='\/') { maxdigit[i] = maxdigit[i]+1; } } return maxdigit[i]; } void maopao(char zyao[20][2][8],int counto) { void pf(char zyao[20][2][8],int counto); int i,j,k; char t[8]; for (k=0;k<counto/2-1;k++) { for (i=0;i<counto/2-1-k;i++) { for (j=0;j<2;j++) { if (strcmp(zyao[i][0],zyao[i+1][0])>0) { strcpy(t,zyao[i][j]); strcpy(zyao[i][j],zyao[i+1][j]); strcpy(zyao[i+1][j],t); } } } } pf(zyao,counto); } void paixu(char zyao[20][2][8],int counto) { void pf(char zyao[20][2][8],int counto); int i,j,k; char t[8]; for (k=0;k<counto/2-1;k++) { for (i=k;i<counto/2-1;i++) { for (j=0;j<2;j++) { if (strcmp(zyao[k][0],zyao[i+1][0])<0) { strcpy(t,zyao[k][j]); strcpy(zyao[k][j],zyao[i+1][j]); strcpy(zyao[i+1][j],t); } } } } pf(zyao,counto); } void pf(char zyao[20][2][8],int counto) { int i,j,k; for (i=0;i<counto/2;i++) { for (j=0;j<2;j++) { for (k=0;k<8;k++) { printf("%c",zyao[i][j][k]); if (zyao[i][j][k]=='\/') { printf("\n"); break; } } } } }
其中的函数void paixu(char zyao[20][2][8],int counto)
中的strcpy在运行时老提示指针错误,我这样的用法有什么问题吗?strcpy(t,zyao[k][j]);
strcpy(zyao[k][j],zyao[i+1][j]);
strcpy(zyao[i+1][j],t);这三行老提示指针错误,哪位能告诉我下这个是为什么?
输入如下:
1 张三 2 李四 3 王五 ^
2
李四
2
以上输入完毕
煮酒论英雄
答案
-
strcpy(t,zyao[k][j]); strcpy(zyao[k][j],zyao[i+1][j]); strcpy(zyao[i+1][j],t);
strcpy会找\0 或0。但是如果zyao[][]所指向的字符串数组不是以\0结尾,就有可能出现内存问题。
检查你的for (i=0;i<20;i++)//输入进行操作的数据各个元素
{
for (j=0;j<2;j++)
{
for (k=0;k<8;k++)
{
scanf("%c",&zyai[i][j][k]);
if (zyai[i][j][k]==' ')
{
zyai[i][j][k] = '\/';
counti = counti+1;
break;
}
if (zyai[i][j][k]=='\^')
{
zyai[i][j][k] = '\/';
i = j = k = 20;
}
}
}
}好像并没有添加结束符。
麻烦把正确答案设为解答。- 已标记为答案 Rob Pan 2011年10月10日 8:15
全部回复
-
strcpy(t,zyao[k][j]); strcpy(zyao[k][j],zyao[i+1][j]); strcpy(zyao[i+1][j],t);
strcpy会找\0 或0。但是如果zyao[][]所指向的字符串数组不是以\0结尾,就有可能出现内存问题。
检查你的for (i=0;i<20;i++)//输入进行操作的数据各个元素
{
for (j=0;j<2;j++)
{
for (k=0;k<8;k++)
{
scanf("%c",&zyai[i][j][k]);
if (zyai[i][j][k]==' ')
{
zyai[i][j][k] = '\/';
counti = counti+1;
break;
}
if (zyai[i][j][k]=='\^')
{
zyai[i][j][k] = '\/';
i = j = k = 20;
}
}
}
}好像并没有添加结束符。
麻烦把正确答案设为解答。- 已标记为答案 Rob Pan 2011年10月10日 8:15