我做了一个简单的C程序,用于反转练习--但是,当我输入一个名字和密码时,它却三番五次地遍历了 for
循环就停止了,并且有一个旋转的光标,最后退出时没有输出回到CLI。我对我的算法进行了修改,并确保它是正确的(该函数的 x
这里不是问题,因为即使在返回其静态值时也会发生冻结)。) 我的程序中哪里走错了?(这是我第一天学习C语言,IDEONE说我有缓冲区溢出)。
程序。
#include <stdio.h>
#include <string.h>
int x(char* s, int c) {
return 65;
}
int main(void) {
char N[16] = ""; // Entered name
char p[16] = ""; // Entered password
char r[16] = ""; // Result of applying keygen `x` to `N` (`p` should be this to be correct)
char n;
printf("Enter name: ");
scanf("%s", N);
printf("Entered name\n");
printf("Enter password: ");
scanf("%s", p);
printf("Entered password\n");
int j;
for (j = 0; j < strlen(N); j++) {
printf("Iterating, iteration %d\n", j);
if (N[j] == 0) {
break;
}
n = x(N, j);
strcat(r, &n);
}
if (strcmp(r, p) == 0) {
printf("Correct!\n");
}
else {
printf("Incorrect!\n");
}
return 0;
}
CLI:
C:\MinGW\bin>gcc "\\Mac\Home\Desktop\My Crackme.c" -o "\\Mac\Home\Desktop\MyCrackme.exe"
C:\MinGW\bin>"\\Mac\Home\Desktop\MyCrackme.exe"
Enter name: Jack
Entered name
Enter password: Not Jack
Entered password
Iterating, iteration 0
Iterating, iteration 1
Iterating, iteration 2
C:\MinGW\bin>
这似乎只发生在我用MinGW编译成一个程序时 exe
- 编译成通用可执行文件,并使用 gcc
在我的Mac上产生一个似乎可以工作的程序。然而,我需要一个 exe
文件。谢谢大家的帮助!
问题出在 strcat(r, &n);
因为 *n
不是一个以空结束的字符串,而是一个单字符。strcat
复制直到遇到第一个空,这里不会。所以你的 r
将会溢出,导致中止。
而不是 strcat
你必须手动添加字符,例如。
int len= strlen(r);
*(r+len )= n;
*(r+len+1)= '\0';
或(更好)。
int len= strlen(r);
if (len<sizeof(r)-1) {
*(r+len )= n;
*(r+len+1)= '\0';
}