我已经写了这段代码,它对一个?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);

09-04 07:21
查看更多