为什么此代码不按预期打印小写字母?

时间:2017-05-08 23:23:12

标签: c

问题是要求用小写字母填充数组然后打印它们。我得到的输出是大写,从F开始,经过Z的5个位置。为什么?

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

int main(int argc, const char **argv)
{   
    char alphabet[27];
    char i;

    for(i = 'a'; i <= 'z'; i++)
        printf("%c", &alphabet[i]);

    return 0;
}

4 个答案:

答案 0 :(得分:1)

您的代码存在两个问题。

  1. 您永远不会初始化char alphabet[27]。你永远不会得到你想要的东西。

  2. 假设您初始化它,您可以执行以下操作

    for(i = 'a'; i <= 'z'; i++) printf("%c", &alphabet[i - 'a']);

  3. 如果您只想打印字母表,只需执行以下操作即可:

    for(i = 'a'; i <= 'z'; i++) printf("%c", i);

答案 1 :(得分:0)

&#39; a&#39;的价值是97.你想要做的是最初将i设置为0。看这里: http://www.asciitable.com/

此外,您希望在循环中使用它之前为数组添加值。像这样:

int index = 0;
while(index < 26) {
    alphabet[index] = index + 'a'; //or alphabet[index] = index + 97
    ++index;
}

答案 2 :(得分:0)

这里有一个问题:你没有初始化字母表而从未使用它。如果只想打印值,则不必使用数组,如:

for(int i = 'a'; i <= 'z'; i++)
    printf("%c", i);

如果你也想填充数组,首先要打印数值。

答案 3 :(得分:0)

我认为这段代码实现了所要求的内容 - 用字母表填充数组,然后将其打印出来。

#include <stdio.h>

int main(void)
{   
    char alphabet[27];
    int i;

    for (i = 'a'; i <= 'z'; i++)
        alphabet[i - 'a'] = i;
    alphabet[i - 'a'] = '\0';
    printf("alphabet: %s\n", alphabet);

    return 0;
}

(顺便说一句,我在发布这些内容之前先检查一下这些内容,在这种情况下,我很高兴我做了。我原来在循环后有alphabet[i] = '\0';,但报告为error: array subscript is above array bounds [-Werror=array-bounds] - 这是正确的!即使是简单的代码也可能出错#34;可能会出错。我的GCC 7.1.0命令行 - 可与许多其他版本配合使用海湾合作委员会的成员是:gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition x3.c -o x3。我建议使用大部分选项 - 至少使用-Wall -Wextra -Werror。)

这类似于问题中的代码,但可能不是我实际编写代码的方式,部分原因是因为几乎让我感到困难。

另一种方法是:

#include <stdio.h>

int main(void)
{   
    char alphabet[26];
    int i;

    for (i = 0; i < 26; i++)
        alphabet[i] = i + 'a';
    printf("alphabet: %.*s\n", 26, alphabet);

    return 0;
}

请注意alphabet不是字符串;它不是以空值终止的。 %.*s转换规范与26参数一起确保最多打印26个字符; alphabet不是字符串并不重要。当然,在循环之后使用稍大一些的数组和alphabet[i] = '\0'; - 类似于其他代码 - 也可以干净地工作,而不会在printf()格式字符串中产生额外的复杂性。

留给我自己的设备,我可能会使用第二个示例程序的空终止版本。

详细了解printf()的POSIX规范。它确实有一些(明显标记的)扩展超过标准C printf(),但它同时适用于POSIX和标准C.然后重新阅读它。并重新阅读它。每天做一个星期,然后每周做一个月,然后每月做一年,然后每年做一次。它将回报努力。类似于scanf(),这比printf()更难使用。