大家都在看
关于C语言二组字符数组问题?
最佳答案
您这谈不上什么机制,就是数组越界了。
在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); } }
声明:知趣百科所有作品均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请在页面底部查找“联系我们”的链接,并通过该渠道与我们取得联系以便进一步处理。