gpt4 book ai didi

c - 数组填C

转载 作者:行者123 更新时间:2023-12-02 05:44:07 26 4
gpt4 key购买 nike

我的程序中有很多数组都有这个问题,我不明白为什么。我想我错过了关于阵列理论的一些东西。

“Someone”在我的数组末尾添加了某种字符,例如 ?^)(&%。例如,如果我有一个长度为 5 且带有“hello”的数组,那么它已满,有时它会打印 hello ?()/&%%。我可以理解,如果它有 10 个元素而我只使用 5 个,它就会发生,所以也许其他 5 个元素会得到一些随机值,但如果它是满的,这些奇怪的值到底从哪里来?

我通过在末尾手动添加字符 '\0' 部分解决了这个问题。

例如,有时当我尝试从另一个数组填充一个数组时会出现此问题(我使用 fgets 从测试文件中读取一行,然后我必须提取单个单词):

...
for(x=0;fgets(c,500,fileb);x++) { // read old local file
int l=strlen(c);
i=0;
for (k=0;k<(l-34);k++) {
if(c[k+33]!='\n') {
userDatabaseLocalPath[k]=c[k+33];
}
}

谢谢

最佳答案

C 中的字符串以值为 0 的字符结束,通常称为字 rune 字,即 '\0'

大小为 5 的字符数组不能容纳字符串 hello,因为终止符不适合。期望终止符的函数会很困惑。

要声明一个包含字符串的数组,最好的语法是:

char greeting[] = "hello";

这样,您就不需要指定长度(计算字符数),因为编译器会为您指定长度。而且你也不需要包含终止符,它是自动添加的,所以上面的代码会在内存中创建:

          +-+-+-+-+-+--+
greeting: |h|e|l|l|o|\0|
+-+-+-+-+-+--+

您说您在“从另一个更长的数组填充一个数组”时遇到问题,这听起来像是一种被称为字符串复制 的操作。由于字符串只是带有终止符的数组,您不能盲目地将较长的字符串复制到较短的字符串上,除非您知道有额外的空间。

鉴于上述情况,此代码将调用未定义的行为:

strcpy(greeting, "hi there!");

因为复制到 greeting 数组中的字符串比数组的空间要长。

这通常可以通过使用“已知足够大”的缓冲区或添加手动跟踪所用空间的检查来避免。有一个名为 strncpy() 的函数可以执行此操作,但我不建议使用它,因为它的确切语义相当奇怪。

关于c - 数组填C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10518028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com