c - C 数组填充

标签 c arrays

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

“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/

相关文章:

windows - 从计算机名称列表中获取登录用户

python - 具有相同形状的 numpy 数组列表中值的元素聚合(平均值)

arrays - 使用初始值作为键和 block 来散列数组以生成键值

c++ - 如何确保 SqLite 中的只读事务?

c - 栈帧和gdb

c - 如何将所有元音从字符串移动到不同的数组

javascript - 改变 JSON 对象的 React 状态 将数组存储为值

c - 终端上的奇怪字符

c++ - C/C++ 中的非保留字符

ios - 循环获取相关元素的indexPath