在C中循环通过数组

在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

不知道有没有人能给我解释一下?我有一个程序,要求用户输入一个句子。然后程序将用户输入读入数组,并将所有元音更改为$符号。我的问题是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");
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

  • A
    char
    是一种完整类型,与
    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,循环的工作原理是一样的。这更“正确”吗?我应该一直使用