在C中循环通过数组
不知道有没有人能给我解释一下?我有一个程序,要求用户输入一个句子。然后程序将用户输入读入数组,并将所有元音更改为$符号。我的问题是for循环是如何工作的?初始化字符c=0时;这不意味着数组元素是int吗?我不明白它是怎么工作的在C中循环通过数组,c,arrays,for-loop,count,C,Arrays,For Loop,Count,不知道有没有人能给我解释一下?我有一个程序,要求用户输入一个句子。然后程序将用户输入读入数组,并将所有元音更改为$符号。我的问题是for循环是如何工作的?初始化字符c=0时;这不意味着数组元素是int吗?我不明白它是怎么工作的 #include <stdio.h> #include <string.h> int main(void) { char words[50]; char c; printf("Enter any number of words: \n"); f
#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;
}
#包括
#包括
内部主(空)
{
字符词[50];
字符c;
printf(“输入任意数量的单词:\n”);
fgets(大写,50,标准文本);
对于(c=0;单词[c]!='\n';c++)
{
如果(单词[c]=“a”|单词[c]=“e”|单词[c]=“i”|单词[c]=“o”|单词[c]=“u”)
{
字[c]=“$”;
}
}
printf(“%s”,字);
返回0;
}
不太可能,char
和int
被隐式转换
在本例中,您可以将char
视为较小的int
sizeof(char)==1
,因此它比int
小,这可能是使用它的原因。从编程角度讲,这种情况没有区别,除非输入字符串很长,在这种情况下,char
将在int
之前溢出。数字文本(例如您的情况下的0
)与char
类型的变量兼容。事实上,即使是用单引号括起来的字符文字(例如'\n'
)也是int
类型,但在分配或与另一个字符进行比较时,会隐式转换为char
数字文字可以与字符文字互换,只要前者不超过字符的范围
以下情况应导致编译器警告:
char c = 257;
鉴于这不会:
char c = 127;
代码将c
视为一个整数变量(在c中,char
基本上是一个非常窄的整数)。在我看来,将其声明为int
(可能是unsigned int
)会更干净。但是,考虑到单词
的长度最多为50个字符,字符c
可以正常工作
至于循环:
c=0
将c
初始化为零
words[c]!='\n'
检查当前字符(words[c]
)是否是换行符,如果是,则停止
c++
在每次迭代后递增c
Achar
是一种完整类型,与short
、int
、long
和long
(以及许多其他类型)一样:
它被定义为编译机器上最小的可寻址单元,通常为8位,这意味着它可以保存128到127的值。一个无符号字符可以保存0-255的值
在上述情况下,它作为迭代器工作,因为它将始终在50
之前停止,并且它最多可以保存127个值。而int类型通常可以保存高达2147483647的值,但占用的空间是机器中8位字符的4倍。int只能保证在C中至少有16位,这意味着值介于−32768和32767或0-65535
表示无符号整数
因此,循环只是访问数组中的元素,一个接一个地访问,如开始时查看第一个字符的words[0]
,然后查看下一个字符的words[1]
。因为你使用了一个字符,我假设在你的机器上是8位,因为这是很常见的。您的字符将足以存储循环的迭代器,直到它超过127。如果你读入超过127个字符(而不是仅仅50个),并使用一个字符进行迭代,你会遇到奇怪的问题,因为这个字符不能容纳128个字符,并且会循环到-128。导致您访问单词[-128]
,这很可能导致分段错误。阵列就像一座建筑物,您有几个楼层,每个楼层都有一个编号
约翰住在一楼。
迈克尔住在二楼
如果你想去乔恩的公寓,在电梯上按1。如果你想去迈克尔家,按2
数组也是如此。数组中的每个位置都存储一个值,在本例中是一个字母
每个职位都有一个相关的索引。第一个位置是0
当您想要访问数组的某个位置时,可以使用数组[position
],其中position
是您想要访问的数组中的索引
变量c
保存要访问的位置。执行单词[c]时,您正在访问数组中的c
nt位置并检索其值
Supose这个词是cool
word[1]
导致o
,
word[0]
导致c
要确定单词的结尾,字符\n
设置在数组的最后一个位置。c
和单词[c]
是完全不同的东西。既然你把c
定义为一个char
,那么如果上界是,比如说,500而不是50,你认为这个代码会怎么样;由于其在for循环中的上下文而转换为int?嗯。。。事实上,他们不仅在那里转换。使用运算符[]
时可能会发生转换。您可以使用任何类型作为迭代器,对此没有任何限制。你可以直接将一个字符转换成一个int,反之亦然,所以char c=0将一个int转换成一个char,所以我应该声明一个单独的int变量来运行循环?i、 e.保留字符c,并声明int i=0;然后在我的循环中用i替换c?@adohertyd:是的,这就是我要做的。我也会删除c
,因为它不再需要了(它只被用作循环计数器)。好的,我只是将c改为int,循环的工作原理是一样的。这更“正确”吗?我应该一直使用