По заданной строке напишите программу для генерации всех возможных строк путем замены? с 0 и 1?
Я написал этот код, он отлично работает для a? B? C? и a? b? c? d? но для a? 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 ♣,
...и так далее.
3 ответа
Как мы видим из вашего кода, с массивом, определенным как char s[10]
и вход
стоит? б? с? д? д?
слишком большой вход для удержания s
наряду с нулевым терминатором
scanf("%s",s);
Вам нужно использовать больший массив. В противном случае, при попытке добавить завершающий нуль после ввода, осуществляется доступ к внешней памяти, которая вызывает неопределенное поведение.
Тем не менее, никогда не разрешайте несвязанный ввод в массив ограниченного размера, всегда используйте ширину поля, чтобы ограничить длину ввода (другими словами, зарезервируйте пространство для нулевого терминатора), как
scanf("%9s",s);
Код выдает правильный вывод здесь, но обратите внимание, что он имеет неопределенное поведение для строк размером больше или равным 10 символам, потому что это размер вашего буфера.
Таким образом, для a?b?c?d?e?
вам нужен буфер длиной не менее 11 символов, чтобы учесть нулевой терминатор. Вы должны сделать s
больше.
Посмотрите на самом деле в C, что происходит в String: каждый раз, когда он добавляет '\0'
персонаж наконец.
Теперь обратите внимание, что в C нет ничего, что называется строкой.
Это массив символов.
Так что, если вы определили, как это
char s[10]
Это фактически принимает массив из менее чем 9 символов, так как последний будет '\0'
персонаж.
Если вы добавите более 9 символов, это даст ошибочный вывод.