none
指针错误?谁能帮我看看 RRS feed

  • 问题

  • 下面代码:

    #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

    以上输入完毕


    煮酒论英雄
    2011年10月3日 4:31

答案

  • 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
    2011年10月6日 3:49
    版主

全部回复

  • 你的代码能编译通过么

    '\/'是什么

    2011年10月4日 7:17
  • 能通过

     


    煮酒论英雄
    2011年10月5日 2:38
  • 我编译没通过

    '\/'有问题

    2011年10月6日 1:43
  • 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
    2011年10月6日 3:49
    版主
  • 哦 谢谢 我试试


    煮酒论英雄
    2011年10月10日 10:22
  • 等我再试试


    煮酒论英雄
    2011年10月10日 10:42