程序返回n个元素的所有排列?无限循环?

时间:2017-12-09 18:46:24

标签: c algorithm

此代码应输出n个元素的所有排列,因此,当我输入例如3 Output时,它必须:

ABC BAC CAB ACB BCA CBA

使用此代码:

#include <stdio.h>
#include <string.h>

void swap(char *x, char *y){
  char temp;
  temp = *x;
  *x = *y;
  *y = temp;
}
void permute(char *a, int l, int r){
  int i;
  if (l == r)
    printf("%s\n", a);
  else
  {
    for (i = l; i <= r; i++){
      swap((a+l), (a+i));
      permute(a, l+1, r);
      swap((a+l), (a+i)); 

    }
  }
}
int main(){
  int x , n ;
  int i = 0 ;
  char str[26];
  printf("prem ");
  scanf("%d",&x);
  while (x > 0){
    str[i] = 'A' + i ;
    i++;
    x--;
  }
  n = strlen(str);
  permute(str, 0, n-1);

}

我应该键入我想要的数字,例如3表示ABC或4表示ABCD,然后代码应该处理,但它没有workea,它进入无限循环

但对于此代码:

#include <stdio.h>
#include <string.h>

void swap(char *x, char *y){
  char temp;
  temp = *x;
  *x = *y;
  *y = temp;
}
void permute(char *a, int l, int r){
  int i;
  if (l == r)
    printf("%s\n", a);
  else
  {
    for (i = l; i <= r; i++){
      swap((a+l), (a+i));
      permute(a, l+1, r);
      swap((a+l), (a+i)); 

    }
  }
}
int main()
{
  char str[26];
  gets(str);
  int n = strlen(str);
  permute(str, 0, n-1);
  return 0;
}

我可以输入我想要的任何东西,并且可以毫无问题地处理它

我的问题是第一个代码有什么问题?我的意思是我想输入一个数字,以便程序:如果我输入3例如它应该处理ABC

3 个答案:

答案 0 :(得分:1)

问题是在未终止的字符串上调用<!doctype html> <html> <head> <script src="https://www.google.com/recaptcha/api.js" async defer> </script> </head> <body> <?php define('GOOGLE_RECAPTCHA_KEY','xxx'); define('GOOGLE_RECAPTCHA_SECRET_KEY','yyy'); $message = false; if ( isset( $_POST['new_comment'], $_POST['g-recaptcha-response'] ) && !empty( $_POST['new_comment'] ) && !empty( $_POST['g-recaptcha-response'] ) ){ echo 'Sauvegarde du commentaire' ; $secret = GOOGLE_RECAPTCHA_SECRET_KEY; $ip = $_SERVER['REMOTE_ADDR']; var_dump($_POST['g-recaptcha-response']); $getResponse = 'https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['g-recaptcha-response']; var_dump($getResponse); $GoogleResponse = file_get_contents($getResponse) ; var_dump($GoogleResponse) ; } ?> <form method='post'> Enter Comment :<br /> <textarea name='new_comment' cols='75' rows='10'></textarea> <?php if( !empty( $message ) )echo $message; ?> <br /> <div class='g-recaptcha' data-sitekey='<?php echo GOOGLE_RECAPTCHA_KEY;?>'></div> <input type='submit' value='Envoyer' /> </form> </body> </html>

要么在字符串的末尾添加strlen来终止它:

'\0'

(更好)

使用原始值while (x > 0){ str[i] = 'A' + i ; i++; x--; } str[i] = '\0'; 调用permute(将其保存在x之后)。

答案 1 :(得分:0)

你的主要应该是:

int main(){
  int x , n ;
  int i = 0 ;
  char str[26];
  printf("prem ");
  scanf("%d",&x);

  //user entered the string length in x, let' save it in n
  n = x;

  while (x > 0){
    str[i] = 'A' + i ;
    i++;
    x--;
  }

  //n = strlen(str); ===> this is wrong, the user did not entered a string

  permute(str, 0, n-1);
}

在工作代码(您发布的第二个代码块)中,用户输入一个存储在str变量中的字符串:

gets(str);

然后使用permute将字符串长度传递给strlen函数:

int n = strlen(str);
permute(str, 0, n-1);

在第一个(非工作)代码块中,您要求用户输入长度而不是字符串,并将其存储在x中。然后,您将x个字符放在str数组中,但这不是正确的 c字符串,因为缺少空终止符。所以strlen返回值几乎不可靠。

如果您不喜欢我建议的解决方案,您可以提供

str[i] = '\0';

while阻止之后,保持其他所有内容不受影响,无论如何都会有效。

答案 2 :(得分:0)

问题是str字符串未正确终止,因此n = strlen(str);的结果未定义。 strlen计算字符,直到遇到\0为止。

int main(){
int x , n ;
int i = 0 ;
char str[26];
printf("prem ");
scanf("%d",&x);
while (x > 0){
    str[i] = 'A' + i ;
    i++;
    x--;
}

str[i] = 0; // terminate the string

n = strlen(str);
permute(str, 0, n-1);

}