我是C的新手并且正在尝试学习打印字符串和数组的单个元素。
在main函数中,我创建了一个包含5个字符的char数组,并且能够打印字符串。我也可以打印数组的1个元素。一切正常。
然后我创建了一个函数,它有一个for循环来填充一个包含26个可用插槽的数组,并且想要做同样的事情,打印整个字符串然后只打印它的一个元素。
当我的程序执行时,它应该打印: 你好 Ø ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ(这应该打印两次,一次用于for循环,然后一次当我尝试打印字符串时) ç
然而,当我这次尝试打印字符时,我遇到了错误,我能看到的唯一区别就是我初始化数组的方式。我不明白它的区别以及为什么它会破裂。它与for循环的范围有关吗?我也尝试使char数组静态,但这也不起作用。 任何人都可以帮忙吗?
这是我的代码
我是C的新手并且正在尝试学习打印字符串和数组的单个元素。
在main函数中,我创建了一个包含5个字符的char数组,并且能够打印字符串。我也可以打印数组的1个元素。一切正常。
然后我创建了一个函数,它有一个for循环来填充一个包含26个可用插槽的数组,并且想要做同样的事情,打印整个字符串然后只打印它的一个元素。
当我的程序执行时,它应该打印: 你好 Ø ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ(这应该打印两次,一次用于for循环,然后一次当我尝试打印字符串时) ç
然而,当我这次尝试打印字符时,我遇到了错误,我能看到的唯一区别就是我初始化数组的方式。我不明白它的区别以及为什么它会破裂。它与for循环的范围有关吗?我也尝试使char数组静态,但这也不起作用。 任何人都可以帮忙吗?
void mystring()
{
char s[26];
for(char ch = 'A'; ch < 'Z'; ch++)
{
int i = 0;
s[i] = ch;
printf("%c", s[i]);
i++;
}
printf("\n%s\n", s);
printf("%c", s[2]);
}
int main()
{
char mystr[5] = "Hello";
printf("%s\n", mystr);
printf("%c\n", mystr[4]);
mystring();
}
答案 0 :(得分:1)
“字符串”没有null
终结符,我写“ strings ”因为它们实际上不是字符串根据c中 string 的定义。
您的i
变量始终为0
,只需使用简单的公式ch - 'A'
即可获得正确的索引。
char mystr[5] = "hello";
空间不足,您需要为终止'\0'
分配空间。
要修复代码,您可以执行此操作
char s[27];
for (int ch = 'A'; ch <= 'Z'; ++ch) {
s[ch - 'A'] = ch;
}
s[26] = '\0';
和
char mystr[6] = "hello";
答案 1 :(得分:1)
首先,您应该在i
循环之外声明for
值,否则i++
命令无效,因为i
始终为0
。
在C 字符串中是具有char
元素的数组,因此在这些容器的末尾应始终放置null
字符。因此,为了具体而言,您需要增加1
数组的大小(27而不是26),并在字符串的最终位置增加s[26] = '\0';
。
答案 2 :(得分:0)
目前,我看到的主要错误是
for(char ch = 'A'; ch < 'Z'; ch++)
{
int i = 0;
s[i] = ch;
printf("%c", s[i]);
i++;
}
您希望在循环外移动声明和初始化语句(int i = 0
)。现在,它每次都将i重置为0(实际上,可能会因为它尝试声明一个具有相同名称的变量而给你错误)
答案 3 :(得分:0)
我要评论你的代码。希望它有所帮助。
void mystring()
{
char s[26];//you need one extra space for the null terminating char, so it should be "char s[27]"
for(char ch = 'A'; ch < 'Z'; ch++)//if you want to print 'Z' as well, this should be "ch <= 'Z'", otherwise it stops at 'Y', which is the last char less than 'Z'
{
int i = 0;//you should declare this i before the loop, along with your char array. The way you're doing it right now, on every loop iteration you redeclare i and give it the value 0, meaning you're just filling the first position of your char array over and over
s[i] = ch;
printf("%c", s[i]);
i++;
}
//s[26] = '\0'; //you should add this line <--remember, strings in C are null-terminated
printf("\n%s\n", s);
printf("%c", s[2]);
}
int main()
{
char mystr[5] = "Hello";//strings in C are null terminated so this should have an extra space "char mystr[6]"
printf("%s\n", mystr);
printf("%c\n", mystr[4]);
mystring();
}