C语言暴力破解程序异常求助:随机猜测结果不符合预期
C语言暴力破解程序问题排查与修复
1. 变量重复定义导致乱码
你在main开头定义了char guess[100];,但循环里又重新定义了一个同名的guess数组:
char guess[100] = {"\0"};
这俩是完全独立的变量——循环里的guess只在当前循环迭代里有效,迭代结束就失效了,你最后打印的其实是开头那个没初始化的guess,里面都是内存垃圾值,所以会出现乱码。
改法:删掉循环里的char guess[100] = {"\0"};,换成每次循环开始时清空开头的guess:
memset(guess, '\0', sizeof(guess));
或者更简单的guess[0] = '\0';,直接把字符串置为空。
2. 错误的字符复制导致非随机字符串
你用strcpy(letter, &letters[i]);拿随机字符,但&letters[i]是从第i个字符开始的整串字符(比如i=16时,就是从'q'到'z'所有字母),strcpy会把这一整串都复制到letter里,再拼到guess,这就是为什么输出是一串递增的字母,不是单个随机字符。
改法:直接给guess的对应位置赋值单个字符就行,不用绕strcpy和strcat:
int pass_len = strlen(pass); for (int j = 0; j < pass_len; j++) { guess[j] = letters[rand() % 26]; } guess[pass_len] = '\0'; // 手动加字符串结束符,避免乱码
如果非要用strcat,就得把单个字符做成合法的字符串:
char letter[2]; // 只存单个字符+结束符 letter[0] = letters[i]; letter[1] = '\0'; strcat(guess, letter);
3. 计数器未初始化导致次数错误
guesses变量定义时没给初始值,一开始是内存里的随机数,最后输出的猜测次数肯定不对。
改法:定义时直接初始化:
unsigned long guesses = 0;
4. 初始循环的无效比较
第一次进入while (strcmp(guess, pass) != 0)时,guess还没初始化,strcmp在比垃圾值,可能出意外。
改法:换成do-while循环,先生成第一次猜测再比较:
do { // 生成猜测的代码 guesses++; printf("%s\n", guess); } while (strcmp(guess, pass) != 0);
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int main() { unsigned long guesses = 0; char guess[100]; char pass[100]; const char letters[26] = "abcdefghijklmnopqrstuvwxyz"; srand(time(NULL)); printf("\ninput your password lowercase letters only: "); scanf("%99s", pass); int pass_len = strlen(pass); do { memset(guess, '\0', sizeof(guess)); for (int j = 0; j < pass_len; j++) { guess[j] = letters[rand() % 26]; } printf("%s\n", guess); guesses++; } while (strcmp(guess, pass) != 0); printf("your guess was %s and was found in %lu guesses\n", guess, guesses); return 0; }
现在输入「yes」,程序会输出长度为3的随机小写字母组合,直到猜中目标,不会再出现多余字符和递增字符串的问题。
内容的提问来源于stack exchange,提问作者user21391428
相关产品推荐
相关产品推荐

