关于C语言二组字符数组问题?

2025-03-14 06:51:1580 次浏览

最佳答案

您这谈不上什么机制,就是数组越界了。

在C语言中定义数组char name[1][20],那么它的内存大小就指定了1行20个字符大小。不能越界赋值或访问!你对错误的代码看到的结果不能说明任何问题。

你想要的是动态数组。应该用malloc和realloc函数来实现动态数组,这里有几个注意点:

1、你输入的是字符串长度不定且一个字符串可能会包含空格,所以不能用scanf("%s")来输入,一方面你不知道字符串长度会输入多少,第二scanf默认把空格作为分割符号。

2、完整的字符串必须要有结束符号0,所以你如果申请字符串长度20,那么最多只能输入19个字符,最后一个字符必须是0。

3、malloc和realloc申请的内存不会自动释放,单独写你这个程序可以不考虑内存释放,但是放在一个大的项目中反复调用,还需要写free函数释放。

下面是我写的演示代码,我是每输入一个字符就申请一个字节的内存,没有浪费。

我加了非常详细的备注,还不清楚请搭配度娘食用。

#include

#include

#include

#include

void meError(void *p);//内存申请失败时报异常并结束程序

int main()

{

    int i;

    char cbuf;//用于接收输入的字符

    int MaxR=0,sLen=1;//MaxR用于累计字符串个数

    char **name=NULL,**nSave=NULL,*strSave=NULL;//name定义一个初始二维数组指针

//----------------初始包含一个长度1的字符串的数组,相当于定义char name[1][1]

    name=(char **)malloc(sizeof(char *));

    meError((void *)name);

    name[MaxR]=(char *)malloc(sizeof(char));

    meError((void *)name[MaxR]);

//--------------------------------------------------------

    while(1)

    {

        cbuf=getchar();

        if(cbuf=='#' && sLen==1)//在新的一行输入#结束输入

            break;

        if(cbuf!=10)//不是回车且当前字符串已满,扩展当前字符串内存大小

        {

            sLen++;

            strSave=(char *)realloc(name[MaxR],sizeof(char)*sLen);

            meError((void *)strSave);

            strSave[sLen-2]=cbuf;

            strSave[sLen-1]=0;//完整字符串必须确保末尾有结束符号0

            name[MaxR]=strSave;

        }

        if(cbuf==10 && sLen>1)//回车,且之前已有输入,开始新的字符串录入

        {

            sLen=1;

            MaxR++;

            nSave=(char **)realloc(name,sizeof(char *)*(MaxR+1));//扩展行内存

            meError((void *)nSave);

            name=nSave;

            name[MaxR]=(char *)malloc(sizeof(char));

            meError((void *)name[MaxR]);

        }

    }

    printf("输入的所有名字为:\n");

    for(i=0;i

        printf("名字%d: %s\n",i+1,name[i]);

    return 0;

}

void meError(void *p)//内存申请失败

{

    if(p==NULL)

    {

        printf("\n异常:内存申请失败!回车结束程序!\n");

        while(getch()!='\r');

        exit(0);

    }

}

声明:知趣百科所有作品均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请在页面底部查找“联系我们”的链接,并通过该渠道与我们取得联系以便进一步处理。