关于C语言中strcat函数使用的一个疑问。

#include<stdio.h>#include<stdlib.h>#include<string.h>int main(){enum Color {red,yellow,blue,white,black};enum Color i,j,k,pri;int n,loop,m;char b[3][7]={0},a[70][22]={0};n=0;for(i=red;i<=black;i++) for(j=red;j<=black;j++) if(i!=j) { for(k=red;k<=black;k++) if((k!=i)&&(k!=j)) {n=n+1; printf("%-4d",n); for(loop=1;loop<=3;loop++) {switch(loop) {case 1:pri=i;break; case 2:pri=j;break; case 3:pri=k;break; default:break; } switch(pri) {case red:{printf("%-10s","red");strcpy(b[loop-1],"Red ");};break; case yellow:{printf("%-10s","yellow");strcpy(b[loop-1],"Yellow ");};break; case blue:{printf("%-10s","blue");strcpy(b[loop-1],"Blue ");};break; case white:{printf("%-10s","white");strcpy(b[loop-1],"White ");};break; case black:{printf("%-10s","black");strcpy(b[loop-1],"Black ");};break; default:break; } }printf("\n"); strcat(a[n-1],b[0]);//将三个b中的函数拼接到a里面 strcat(a[n-1],b[1]); } }printf("\ntotal:%5d\n",n); for(m=0;m<n-1;m++) { for(loop=0;loop<20;loop++) printf("%c",a[m-1][loop]); printf("\n");} return 0; } 原题是C语言程序设计第四版的例9.12 ,我想将结果弄到一个二维字符串里面,在调试的时候发现拼接函数明明没有加上b[2],a里面就已经有了b[2]的内容,如果加一行strcat(a[n-1],b[2]);运行的时候会报错。

问题并不是出在strcat上

而是出在strcpy上

或者说 出在你定义的b上


定义的b是char b[3][7]={0}

每行7个元素。 

而"Yellow " 复制这个的时候 加上空格和结束符是8个元素。于是越界了。

这样接下来的strcat就会出不可预知错误。


除此外,最后的打印也有问题。 要从m开始。 同时打印到结束符就可以了。 其实这个用%s就好。 


改了下  ä½ çœ‹çœ‹

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
enum Color {red,yellow,blue,white,black};
enum Color i,j,k,pri;
int n,loop,m;
char b[3][8]={0},a[70][22]={0};//扩大空间
n=0;
for(i=red;i<=black;i++)
for(j=red;j<=black;j++)
if(i!=j)
{
for(k=red;k<=black;k++)
if((k!=i)&&(k!=j))
{
n=n+1;
printf("%-4d",n);
for(loop=1;loop<=3;loop++)
{
switch(loop)
{
case 1:pri=i;break;
case 2:pri=j;break;
case 3:pri=k;break;
default:break;
}
switch(pri)
{
case red:{printf("%-10s","red");strcpy(b[loop-1],"Red ");};break;
case yellow:{printf("%-10s","yellow");strcpy(b[loop-1],"Yellow ");};break;
case blue:{printf("%-10s","blue");strcpy(b[loop-1],"Blue ");};break;
case white:{printf("%-10s","white");strcpy(b[loop-1],"White ");};break;
case black:{printf("%-10s","black");strcpy(b[loop-1],"Black ");};break;
default:break;
}
}
printf("\n");
strcat(a[n-1],b[0]);
strcat(a[n-1],b[1]);
strcat(a[n-1],b[2]);//增加第三个
}
}
printf("\ntotal:%5d\n",n);
for(m=0;m<n-1;m++)
{
//for(loop=0;loop<20;loop++)//打印部分修改
printf("%s", a[m]);
// printf("%c",a[m-1][loop]);
printf("\n");
}
return 0;
}
温馨提示:答案为网友推荐,仅供参考
相似回答