YYDD125 2023-11-26 14:26 采纳率: 33.3%
浏览 7
已结题

运行c程序遇到(signal 11)怎么办

问题代码

#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int findLastDigit(char* str);
void fMain();
char* encrypt(char* str, int key);
int timeGet();
void res();
void equal(char ap);
char str[100],pwd[8];
int findLastDigit(char* str)
{
    int len = strlen(str);
    for (int i = len - 1; i >= 0; i--)
    {
        if (isdigit(str[i]))
        {
            return str[i]-'0';
        }
    }
    return -1;
}
void fMain()
{
    scanf("%s",pwd);
    int ed=findLastDigit(pwd);  // fix here
    char* spd=encrypt(pwd, ed);  // fix here
    FILE *fp = fopen("pwd.txt", "w");
    if (fp == NULL)
    {
        printf("Failed to open file.\n");
        exit(-1);
    }
    char edc=ed+'0';
    fprintf(fp, "%s", spd);
    fprintf(fp, "%c", edc);
    fclose(fp);
    printf("String written to file successfully.\n");
}
void res()
{
    FILE *fp = fopen("pwd.txt", "r");
    if (fp == NULL)
    {
        printf("Failed to open file.\n");
        exit(-1);
    }
    char epwd[20];
    fgets(epwd,20,fp);
    char *p = epwd; // 指向字符串的指针
    char lc = p[strlen(p) - 1]; // 获取最后一个字符
    int ld=lc-'0';
    char aPwd[50];
    int len = strlen(epwd) - 1; // 字符串长度减1
    char run[8];
    epwd[len]='\0';
    ld=0-ld;
    scanf("%s",run);
    char *spd=encrypt(epwd,ld);
    if (strcmp(run,spd)==0)
    {
        equal(lc);

    }
}
void equal(char lc)
{
    char ap[20];
    int eTime=timeGet();
    char* spd=encrypt(ap,eTime);
    strcat(spd,&lc);
    system("pwd");
    puts("ok!");
    exit(0);
}
char* encrypt(char* str, int key)
{
    // 分配足够的内存来保存加密后的字符串
    char* encryptedStr = (char*)malloc(strlen(str) + 1);
    
    for(int i = 0; str[i]; i++)
    {
        // 先将字符转化为其ASCII码
        int ascii = (int)str[i];
        // 加密ASCII码
        ascii = (ascii + key) % 256;
        // 再将ASCII码转化回字符
        encryptedStr[i] = ascii;
    }
    // 添加字符串的结束符
    encryptedStr[strlen(str)] = '\0';
    
    // 返回加密后的字符串
    return encryptedStr;
}

int timeGet()
{
    time_t rawtime;
    struct tm * timeinfo;
    time(&rawtime);
    timeinfo = localtime(&rawtime);
    return timeinfo->tm_year + timeinfo->tm_mon + timeinfo->tm_mday + timeinfo->tm_hour + timeinfo->tm_min;
}
int main()
{
    int d;
    puts("are you want to do");
    puts("1.write password");
    puts("2.check&run-exec");
    puts("3.write a visual password");
    scanf("%d",d);
    switch(d)
    {
    case 1:
        fMain();
        break;
    case 2:
        res();
        break;
    case 3:
        break;
    }
    return 0;
}

  • 写回答

2条回答 默认 最新

  • K_n_i_g_h_t_1990 2023-11-26 16:39
    关注

    signal 11(段错误)通常是因为程序试图访问其“不属于它”的内存。这可能是由于多种原因引起的,例如对空指针或无效指针进行解引用、缓冲区溢出或其他与内存相关的问题。

    在你的代码中,我注意到了一些潜在的问题:

    1. main函数中的scanf函数中,你应该使用&d而不是d来正确读取值到变量d
    scanf("%d", &d);
    
    1. encrypt函数中,你使用mallocencryptedStr分配内存,但在使用后没有释放这块内存。这可能导致内存泄漏。

    为了修复这个问题,在encrypt函数的末尾添加以下行来释放已分配的内存:

    free(encryptedStr);
    

    在进行这些更改后,如果段错误仍然存在,你可能需要进一步调查代码,并使用调试技术来识别问题的具体原因。

    另外,请确保使用调试器(例如Linux上的gdb)获取有关段错误的更多信息。你可以使用调试器运行程序以分析回溯,并找到错误发生的具体行。例如:

    gdb ./your_program
    run
    

    然后,当程序崩溃时输入:

    bt
    

    这将显示回溯,帮助你定位问题所在的代码。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月14日
  • 已采纳回答 12月6日
  • 创建了问题 11月26日

悬赏问题

  • ¥40 图书信息管理系统程序编写
  • ¥15 7-1 jmu-java-m02-使用二维数组存储多元线性方程组
  • ¥20 Qcustomplot缩小曲线形状问题
  • ¥15 企业资源规划ERP沙盘模拟
  • ¥15 树莓派控制机械臂传输命令报错,显示摄像头不存在
  • ¥15 前端echarts坐标轴问题
  • ¥15 ad5933的I2C
  • ¥15 请问RTX4060的笔记本电脑可以训练yolov5模型吗?
  • ¥15 数学建模求思路及代码
  • ¥50 silvaco GaN HEMT有栅极场板的击穿电压仿真问题