我正在尝试用C语言创建一个程序,它接受用户的输入并且“进化”#39;一个随机字符串,直到它与输入匹配。到目前为止它在7个字符或更少的输入上工作正常,但是一旦用户输入8个字符,程序就无法工作。我无法弄清楚我哪里出错了。这是代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
void mutate(char ancestor[], char descendent[]);
void evolve(char descendent[]);
int main(void)
{
srand(time(NULL));
char input[50];
printf("Please Enter a String:\n");
scanf("%s", input);
evolve(input);
return 0;
void evolve(char descendent[])
{
size_t length = strlen(descendent);
char ancestor[50];
int i;
for(i = 0; i < length; i++)
ancestor[i] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"[rand() % 52];
while(strcmp(ancestor, descendent)){
mutate(ancestor, descendent);
printf("%s\n", ancestor);
}
}
void mutate(char ancestor[], char descendent[])
{
int i;
size_t length = strlen(descendent);
for(i = 0; i < length; i++){
if(ancestor[i] != descendent[i]){
ancestor[i] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"[rand() % 52];
}
}
}
答案 0 :(得分:2)
首先,您必须检查错误:
Laravel 5.1.x
char input[50];
scanf("%s", input);
成功了吗?用户可以为scanf
输入超过50个字符:
input
您需要使用例如检查有效输入的输入字符串if (scanf("%49s", input) != 1){
printf("incorrect input\n");
return 1; // error
}
:
isalpha()
最好使用C preprocessor Stringification:
n = strlen(input);
for (i = 0; i < n; i++){
if (!isalpha(input[i])) {
printf("incorrect input\n");
return 1; // error
}
}
这会问,#define MAX_LEN 4
#define STR2(n) #n
#define STR(n) STR2(n)
printf("Please Enter a String[A-Z,a-z] with max length:"STR(MAX_LEN)"\n");
if (scanf("%"STR(MAX_LEN)"s", input) != 1){
printf("incorrect input\n");
return 1; // error
}
。
限制为49个字母,我认为完成可能需要一辈子的时间!
在Please Enter a String[A-Z,a-z] with max length:4
内,您需要确保evolve()
字符串已被NUL终止:
ancestor
以下是我的改进工作示例:
ancestor[i] = 0;
答案 1 :(得分:0)
问题出在strcmp
。请阅读:http://www.cplusplus.com/reference/cstring/strcmp/
此函数开始比较每个字符串的第一个字符。如果 它们彼此相等,继续以下对 直到字符不同或直到终止空字符为止 达到。强>
但是对于char ancestor[50];
,你不要给它一个空字符。所以strcmp
会有不确定的行为。