C语言 为什么int数组的第一个元素与for循环中追加的元素不同?

nbewdwxp  于 2023-01-29  发布在  其他
关注(0)|答案(2)|浏览(128)

我有两个问题。第一个问题是,我试图找到句子的频率并将其放入另一个数组中。但是,新频率nfreq的输出与for循环中追加的内容不同。

void append(char* s, char c) 
{
    int len = strlen(s);
    s[len] = c;
    s[len+1] = '\0';
}

int main()
{

    char str[] = "test sentence";
    char nstr[] = "";
    int freq[256] = {};
    int nfreq[256] = {};

    for(int i = 0; str[i] != '\0'; i++)
    {
        freq[str[i]]++;
    }
     
    printf("\nCharacter   Frequency\n");

    int j = 0;

    for(int i = 0; i < sizeof(freq) / sizeof(int); i++)
    {
        if(freq[i] != 0)
        {
            printf("%5c%10d\n", i, freq[i]);  
            char c = i;
            append(nstr, c);
            int f = freq[i];
            nfreq[j] = f;
            printf("Num in nfreq[%d] is %d\n", j, nfreq[j]);
            j++;
        }
    }

    for(int i = 0; i < strlen(nstr); i++)
    {
        printf("%d ", nfreq[i]);
    }
    printf("\n");

    printf("size of nfreq : %lu\n", sizeof(nfreq) / sizeof(nfreq[0]));
    printf("size of str : %lu\n", strlen(str));
    printf("size of nstr : %lu\n", strlen(nstr));
    printf("nstr is : %s\n", nstr);

    return 0;
}

每个字母出现的频率为

Character   Frequency
              1
    c         1
    e         4
    n         2
    s         2
    t         3

在上面的代码中,nfreq应该在数组中有{1, 1, 4, 2, 2, 3},它甚至在循环中写了Num in nfreq[0] is 1等等,但是当我在循环外检查nfreq中有什么的时候,它输出的是{116, 1, 4, 2, 2, 3},这是什么,对于' '的频率应该是1
第二个问题是,如果我不声明int数组的大小,像开头那样,这个数组的大小,在用for循环附加int之后,是动态改变的,还是保持为0?
我试着通过不声明nfreq数组的大小(我认为这并不重要)来修复它。提前感谢您的帮助:)
编辑:对不起,我忘了添加附加功能。

xdyibdwo

xdyibdwo1#

char nstr[] = "";

nstr一个字符的数组。

append(nstr, c);
...
s[len+1] = '\0';

len为0,因此len + 1为1。此行正在向nstr写入越界值。nstrchar [1]。您只能写入nstr[0] = somethingnstr[1]无效。
执行:

char nstr[256] = "";

如果我不声明一个int数组的大小,int nfreq []={},像开头那样,这个数组的大小,在用for循环附加int之后,会动态改变吗?
注意:{}在技术上是无效的,请使用{0}Is an empty initializer list valid C code?int nfreq[] = {}在技术上是无效的代码,它没有意义,如果它有意义,那么nfreq的大小将为零。
数组大小 * 没有 *"动态"更改。数组大小恒定。向数组写入越界内容是代码中的错误。

edqdpe6u

edqdpe6u2#

无效的初始化:

int freq[256] = {};

无效。ISO C禁止空的初始值设定项大括号。初始值设定项列表必须至少包含一个初始值设定项。
或许:

int freq[256] = { 0 };

回复:
如果我不声明一个int数组的大小,int nfreq []={},像开头那样,这个数组的大小,在用for循环附加int之后,是动态变化的,还是保持为0?
答:没有。

int nfreq[] = {};

不是有效语句。空间不会动态更改。
声明一个固定大小的自动数组,如下所示:

int nfreq[SIZE] = { 0 };

或者动态地用malloc()分配存储器,并且在必要时用realloc()重新分配。

格式说明符不正确:

strlen()sizeof()返回类型size_t%lu可能不是size_t的正确格式说明符。请改用%zu。另请参阅:

写入超出界限的内存:

void append(char* s, char c) 
{
    int len = strlen(s);
    s[len] = c;
    s[len+1] = '\0';
}

你没有为已经衰减到append()中指针的数组分配任何内存,所以这会写入超出边界的内存,并表现出未定义的行为。

相关问题