此代码应输出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
答案 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);
}