【问题标题】:Getting different lengths for the same operation with different number values in C在C中使用不同的数值为相同的操作获取不同的长度
【发布时间】:2017-11-28 19:48:49
【问题描述】:

我有 2 个 for 循环,它们用字母表中的字母填充数组。我有一个lowercase 数组集和一个uppercase 数组集。问题是当我用字母初始化数组时,返回的长度不同。

char uppercase[26];
char lowercase[26];
int indexUpper = 0;
int indexLower = 0;


// Get uppercase array:
for(int a = 65; a <= 90; a++){
    uppercase[indexUpper] = a;
    indexUpper++;
}

// Get lowercase array:
for(int b = 97; b <= 122; b++){
    lowercase[indexLower] = b;
    indexLower++;
}

printf("UPPERCASE = %lu\n", strlen(uppercase));
printf("LOWERCASE = %lu\n", strlen(lowercase));

$=> UPPERCASE = 26
$=> LOWERCASE = 27

如果这是一个没有脑子的问题,我深表歉意。我真的在努力学习和理解 C 语言及其规则。感谢所有做出贡献的人。

【问题讨论】:

  • 代码无法编译 -> 缺少}
  • 请将整个代码贴出来,方便回答的人
  • strlen 需要一个以 nul 结尾的数组。这里似乎没有发生。
  • strlen 需要一个指向字符串的指针作为参数。您正在传递一些不指向字符串的东西。行为未定义。
  • @ilkkachu 对不起,我的错我似乎算错了。对不起

标签: c arrays for-loop


【解决方案1】:

strlen() 一直读取字符数组,直到找到 NUL 字节('\0',数值为零)。您的数组不包含任何内容,因为您没有在那里分配一个。

这意味着strlen 将继续读取数组末尾,这是非法的,并且结果行为未定义。得到 27 是相当温和的,你可能得到任意数字,或者你的程序可能会崩溃。

如果你想使用strlen(),你应该在字符串的末尾显式分配一个NUL字节,当然要为其分配空间。

大概是这样的:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char upper[27];
    int i;
    for (i = 0 ; i < 26; i++) {
        /* This only works in a character set where the letters
           are contiguous */
        upper[i] = 'A' + i;
    }
    /* i == 26 now */
    upper[i] = '\0';
    printf("len: %u\n", (unsigned) strlen(upper));
    return 0;
}

(尽管在这里使用strlen 似乎毫无意义,因为您已经知道这些数组中的项目数。)

【讨论】:

    【解决方案2】:

    当使用strlen 时,char 数组 必须 以 nul 终止 - 但你的数组不是,所以你有未定义的行为。

    要打印数组的大小,请尝试:

    printf("UPPERCASE = %zu\n", sizeof uppercase);
    printf("LOWERCASE = %zu\n", sizeof lowercase);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 2022-07-20
      • 1970-01-01
      • 2018-07-22
      • 2021-01-15
      • 2012-12-23
      相关资源
      最近更新 更多