问题是要求用小写字母填充数组然后打印它们。我得到的输出是大写,从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;
}
答案 0 :(得分:1)
您的代码存在两个问题。
您永远不会初始化char alphabet[27]
。你永远不会得到你想要的东西。
假设您初始化它,您可以执行以下操作
for(i = 'a'; i <= 'z'; i++)
printf("%c", &alphabet[i - 'a']);
如果您只想打印字母表,只需执行以下操作即可:
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()
更难使用。