我已经写了这段代码,它对一个?b?c?还有一个?b?C?d?但是为了一个?b?C?d?e?它在最后给出一个额外的垃圾值。在s的结尾处附加了“\0”字符,然后说明读取垃圾值的原因和方式。我试图通过在代码之间放置printf语句来调试它,但无法解析它。请帮忙。
#include<stdio.h>
void print(char* s,char c[],int l)
{
int i,j=0;
for(i=0;s[i]!='\0';i++)
{
if(s[i]=='?')
{
printf("%c",c[j]);
j++;
}
else
printf("%c",s[i]);
}
printf(", ");
}
void permute(char *s,char c[],int l,int index)
{
if(index==l)
{
print(s,c,l);
return;
}
c[index]='0';
permute(s,c,l,index+1);
c[index]='1';
permute(s,c,l,index+1);
}
int main()
{
char s[10],c[10];
printf("Enter a string.");
scanf("%s",s);
int i,ct=0;
for(i=0;s[i]!='\0';i++)
{
if(s[i]=='?')
ct++;
}
permute(s,c,ct,0);
return 0;
}
我的输出是这样的:-
a0b0c0d0e0∮,a0b0c0d0e1∮,
……等等。
最佳答案
从您的代码中可以看到,数组定义为char s[10]
,输入为
一个?b?C?d?e?
输入太大,无法与空终止符一起保存在s
中
scanf("%s",s);
你需要使用更大的数组。否则,在尝试在输入之后添加终止空值时,将对调用undefined behaviour的出界内存进行访问。
也就是说,决不允许对大小有限的数组进行未绑定的输入,始终使用字段宽度来限制输入长度(换句话说,为空终止符保留空间),如
scanf("%9s",s);