给定一个字符串写一个程序,通过替换生成所有可能的字符串? 0和1?

时间:2015-07-28 10:46:56

标签: c arrays string recursion scanf

我已经编写了这段代码,它可以正常使用?b?c?和一个?b?c?d?但对于一个?b?c?d?e?它最后给了一个额外的垃圾值。在结尾处有' \ 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♣,

......等等。

3 个答案:

答案 0 :(得分:3)

正如我们从您的代码中看到的那样,数组定义为char s[10],输入为

  

一个?B 4 C?d?E'

big

s

您需要使用更大的阵列。否则,在输入后尝试添加终止空值时,将访问调用undefined behaviour的越界内存。

也就是说,永远不允许未绑定输入到有限大小的数组,总是使用字段宽度来限制输入长度(换句话说,保留空间对于null-terminator),比如

 scanf("%s",s);

答案 1 :(得分:1)

代码在这里生成正确的输出,但请注意,对于大小大于或等于10个字符的字符串,它具有未定义的行为,因为它是缓冲区的大小。

因此,对于a?b?c?d?e?,您需要一个至少包含11个字符的缓冲区来计算空终止符。你应该让s更大。

答案 2 :(得分:0)

实际上在C中看到String中发生的事情是每次它最后附加一个'\0'字符。

现在注意在C中没有任何叫做字符串的内容。

它的字符数组。

所以如果你这样定义了 -

char s[10]

这实际上接受一个少于9个字符的数组,因为最后一个将是'\0'个字符。

如果添加超过9个字符,则会产生错误输出。