想知道是否有人可以向我解释这个问题?我有一个程序要求用户输入一个句子。然后程序将用户输入读入数组并将所有元音更改为$符号。我的问题是for循环是如何工作的?初始化char c = 0时;这不意味着数组元素是一个int?我无法理解它是如何运作的。
#include <stdio.h>
#include <string.h>
int main(void)
{
char words[50];
char c;
printf("Enter any number of words: \n");
fgets(words, 50, stdin);
for(c = 0; words[c] != '\n'; c++)
{
if(words[c] =='a'||words[c]=='e'||words[c]=='i'||words[c]=='o'||words[c]=='u')
{
words[c] = '$';
}
}
printf("%s", words);
return 0;
}
答案 0 :(得分:3)
代码将c
视为整数变量(在C中,char
基本上是一个非常窄的整数)。在我看来,将它声明为int
(也许是unsigned int
)会更清晰。但是,鉴于words
长度最多为50个字符,char c
工作正常。
关于循环:
c = 0
将c
初始化为零。words[c] != '\n'
检查 - 在开始时和每次迭代后 - 当前字符(words[c]
)是否为换行符,如果是,则停止。c++
会增加c
。答案 1 :(得分:1)
阵列就像一座建筑物,你有几个楼层,每个楼层都有一个号码。
在1楼生活约翰。 在2楼,迈克尔生活。
如果你想去Jonh公寓,你可以按电梯上的1。如果你想去迈克尔,你按2。
与数组相同。数组中的每个位置都存储一个值,在本例中为字母。
每个职位都有一个相关的指数。第一个位置是0。
如果要访问数组的位置,请使用数组[position
],其中position
是要访问的数组中的索引。
变量c
保持被激活的位置。当您执行单词[c]时,您将访问数组中的c
nt位置并检索其值。
将单词设为cool
word[1]
会产生o
,
word[0]
会产生c
要确定单词的结尾,可以在数组的最后位置设置caracter \n
。
答案 2 :(得分:0)
实际上,char
和int
是隐式转换的。
在这种情况下,您可以将char
视为较小的int
。 sizeof(char) == 1
,因此它小于int
,这可能是它被使用的原因。以编程方式,在这种情况下没有区别,除非输入字符串很长,在这种情况下char
将在int
之前溢出。
答案 3 :(得分:0)
数字文字(例如您的0
)与char
类型的变量兼容。实际上,即使是用单引号括起来的字符文字(例如'\n'
)也属于int
类型,但在分配或与另一个char
进行比较时会隐式转换为char
只要前者不超出字符的范围,数字文字就可以与字符文字互换。
以下内容应导致编译器警告:
char c = 257;
然而这不会:
char c = 127;
答案 4 :(得分:0)
char
是C是一个整数类型,short
,int
,long
和long long
(以及许多其他类型):
它被定义为您正在编译的机器上的最小可寻址单元,通常为8位,这意味着它可以保存-128到127的值。而无符号字符可以保存0到255的值。
它在上面作为迭代器起作用,因为它将始终在50
之前停止并且它可以保存最多127的值。而int类型通常可以容纳最多2,147,483,647的值,但是占用4倍机器中的空间为8位字符。 int仅保证在C中至少为16位,这意味着对于unsigned int,值介于-32,768和32,767或0 - 6,5535
之间。
所以你的循环只是访问数组中的元素,一开始就像words[0]
一样查看第一个字符,然后words[1]
查看下一个字符。因为你使用的是char,我假设你的机器上有8位,因为这很常见。你的char将足以存储你的循环的迭代器,直到它超过127.如果你读取超过127个字符(而不是只有50个)并使用char迭代你会遇到奇怪的问题,因为char不能保持128并将循环到-128。导致您访问最有可能导致分段错误的words[-128]
。