我的C程序的 "for "循环在迭代3次后停顿了。

问题描述 投票:0回答:1

我做了一个简单的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 文件。谢谢大家的帮助!

c for-loop mingw
1个回答
2
投票

问题出在 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';
}
© www.soinside.com 2019 - 2024. All rights reserved.