为什么这段代码给我一个SIGABRT错误? C程序设计

问题描述

#include "framework.h"
#include <stdio.h>
//-----------------------------------------------------------------------------
// Computes and returns the length of a string
//
// @param text string to check
//
// @return length of the string
//
int stringLength(char *text);

//-----------------------------------------------------------------------------
// Changes a string to upper case
//
// @param text string to modify
//
void toupper(char *text);


//-----------------------------------------------------------------------------
int stringLength(char *text)
{
    int  string_length = 0;

    while (text[string_length] != '\000')
        string_length++;

    return string_length;
}

// Main Function
//
int main()
{
    char key[MAX_KEY_LENGTH] = {};
    int string_len = 0;

    do {
        printf(KEY_PROMPT);
        gets(key);
        string_len = stringLength(key);
        if (string_len <= MAX_KEY_LENGTH && string_len > 0)
        {
            break;
        }
    } while (string_len > MAX_KEY_LENGTH || string_len < 0);
}

这是我的代码。 总是在我第一次输入太长的字符串时 (例如“学生学生学生学生学生学生学生学生学生学生”) 然后是“正确的” (例如“学生”)

它给了我这个错误:(看图片

error code

解决方法

为什么会出现“堆栈粉碎”?

此语句:

gets(key);

保持将越来越多的字符放入内存。所以你的输入:

Student StudentStudent StudentStudent StudentStudent StudentStudent Student

溢出输入缓冲区:key[]结果是未定义的行为(并且可能导致seg故障事件。)如您所见,输入缓冲区key[]的溢出破坏了堆栈。再次绕过循环并不能“神奇地”修复损坏的堆栈。

因此,请使用fgets()而不是gets(),因为gets()不知道何时给fgets()指定特定的停止点,何时停止输入更多字符。

强烈建议阅读:man fgets,以获取该功能的详细信息

,

我认为您有缓冲区溢出错误。查看this answer,希望对您有所帮助。