C “我一直被展示”;双重自由或腐败(外)“;在我的阅读计划和我';我不确定这是什么意思(固定的)

C “我一直被展示”;双重自由或腐败(外)“;在我的阅读计划和我';我不确定这是什么意思(固定的),c,cs50,C,Cs50,我在写一个程序,输入文本,输出文本,用字母、句子和单词的数量打印文本的阅读水平。然后,它计算这些数量,并找出每100个单词中字母的平均值,以及每100个单词中句子的平均值。最后,平均数将通过Coleman-Liau指数得出,并将结果打印出正确的等级。这一切都做得很好,但我有一个问题,我一直被显示为“双重自由或腐败(out)”,我不知道这是什么意思。 我对编码是新手,所以我很难确定问题出在哪里,但是 #include <stdio.h> #include <cs50.h>

我在写一个程序,输入文本,输出文本,用字母、句子和单词的数量打印文本的阅读水平。然后,它计算这些数量,并找出每100个单词中字母的平均值,以及每100个单词中句子的平均值。最后,平均数将通过Coleman-Liau指数得出,并将结果打印出正确的等级。这一切都做得很好,但我有一个问题,我一直被显示为“双重自由或腐败(out)”,我不知道这是什么意思。
我对编码是新手,所以我很难确定问题出在哪里,但是

#include <stdio.h>
#include <cs50.h>
#include <math.h>
#include <string.h>
int main(void)
{

    float l = 0;
    float s = 0;
    float w = 0;
    int o = 2;

    string t = get_string("Text: ");

    t[-1] = (char)32;

    for(int i = -1;t[i] != '\0'; i++)
    {
        if(t[i] >= (char)65 && t[i] <= (char)90)
        {
            l++;
            if (o == 1)
            {
                w++;
                o = 2;
            }
        }
        else if(t[i] >= (char)97 && t[i] <= (char)122)
        {
            l++;
            if (o == 1)
            {
                w++;
                o = 1;
            }
        }
        else if(t[i] == '.' || t[i] == '!' || t[i] == '?')
        {
            s++;
        }
        else if(t[i] == (char)32)
        {
            o = 1;
        }
    }
#包括
#包括
#包括
#包括
内部主(空)
{
浮点数l=0;
浮点数s=0;
浮点数w=0;
INTO=2;
字符串t=获取字符串(“文本:”);
t[-1]=(字符)32;
for(int i=-1;t[i]!='\0';i++)
{
如果(t[i]>=(char)65&&t[i]=(char)97&&t[i]=1&&16)
{
printf(“16级以上”);
}
printf(“\n”);
}
您的问题是:

t[-1] = (char)32;
您在
get\u string
返回的
malloc
字符串之前写入。因此,您在堆用来跟踪分配的内部/隐藏元数据上涂鸦


为什么要使用负索引?

指定给
t[-1]的行
是可疑的;通常只能指定零或正索引。使用负索引时,您正在覆盖用于簿记目的的内存。请使用“a”而不是65。谢谢Craig Estey!它消失了!我使用负索引的全部原因是通过将负第一个字符更改为a来保持字数的准确性空格会导致一个单词的第一个字母被查找。我不知道为什么我没有早点想到这一点,但现在在循环开始之前,它已经准备好查找单词的第一个字母了。
t[-1] = (char)32;