我有两个问题。第一个问题是,我试图找到句子的频率并将其放入另一个数组中。但是,新频率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
数组的大小(我认为这并不重要)来修复它。提前感谢您的帮助:)
编辑:对不起,我忘了添加附加功能。
2条答案
按热度按时间xdyibdwo1#
nstr
是一个字符的数组。len
为0,因此len + 1
为1。此行正在向nstr
写入越界值。nstr
为char [1]
。您只能写入nstr[0] = something
。nstr[1]
无效。执行:
如果我不声明一个int数组的大小,int nfreq []={},像开头那样,这个数组的大小,在用for循环附加int之后,会动态改变吗?
注意:
{}
在技术上是无效的,请使用{0}
Is an empty initializer list valid C code?。int nfreq[] = {}
在技术上是无效的代码,它没有意义,如果它有意义,那么nfreq
的大小将为零。数组大小 * 没有 *"动态"更改。数组大小恒定。向数组写入越界内容是代码中的错误。
edqdpe6u2#
无效的初始化:
无效。ISO C禁止空的初始值设定项大括号。初始值设定项列表必须至少包含一个初始值设定项。
或许:
回复:
如果我不声明一个int数组的大小,int nfreq []={},像开头那样,这个数组的大小,在用for循环附加int之后,是动态变化的,还是保持为0?
答:没有。
不是有效语句。空间不会动态更改。
声明一个固定大小的自动数组,如下所示:
或者动态地用
malloc()
分配存储器,并且在必要时用realloc()
重新分配。格式说明符不正确:
strlen()
和sizeof()
返回类型size_t
。%lu
可能不是size_t
的正确格式说明符。请改用%zu
。另请参阅:写入超出界限的内存:
你没有为已经衰减到
append()
中指针的数组分配任何内存,所以这会写入超出边界的内存,并表现出未定义的行为。