当超过7个字符时,C字符串表现异常

时间:2016-06-21 03:08:18

标签: c

我正在尝试用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];
        }
    }
}

2 个答案:

答案 0 :(得分:2)

首先,您必须检查错误:

Laravel 5.1.x
  1. char input[50]; scanf("%s", input); 成功了吗?
  2. 用户可以为scanf输入超过50个字符:

    input
  3. 您需要使用例如检查有效输入的输入字符串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个字母,我认为完成可能需要一辈子的时间!

  4. Please Enter a String[A-Z,a-z] with max length:4内,您需要确保evolve()字符串已被NUL终止:

    ancestor
  5. 以下是我的改进工作示例:

    ancestor[i] = 0;
    

答案 1 :(得分:0)

问题出在strcmp。请阅读:http://www.cplusplus.com/reference/cstring/strcmp/

  

此函数开始比较每个字符串的第一个字符。如果   它们彼此相等,继续以下对   直到字符不同或直到终止空字符为止   达到。

但是对于char ancestor[50];,你不要给它一个空字符。所以strcmp会有不确定的行为。