【问题标题】:Looping through an array in C循环遍历C中的数组
【发布时间】:2012-01-05 15:20:43
【问题描述】:

只是想知道是否有人可以向我解释一下?我有一个程序要求用户输入一个句子。然后程序将用户输入读入一个数组并将所有元音更改为 $ 符号。我的问题是 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;
}

【问题讨论】:

  • cwords[c] 是完全不同的东西。既然您将 c 定义为 char,那么如果上限是 500 而不是 50,您认为这段代码会发生什么?

标签: c arrays for-loop count


【解决方案1】:

代码将c 视为一个整数变量(在C 中,char 基本上是一个非常窄的整数)。在我看来,将其声明为int(也许是unsigned int)会更干净。但是,鉴于 words 最多有 50 个字符,char c 可以正常工作。

关于循环:

  1. c = 0c 初始化为零。
  2. words[c] != '\n' 在开始时以及每次迭代之后检查当前字符 (words[c]) 是否为换行符,如果是则停止。
  3. c++ 在每次迭代后递增 c

【讨论】:

  • 所以我真的应该声明一个单独的 int 变量来运行循环吗?即离开 char c 并声明 int i = 0;然后在我的循环中用 i 替换 c?
  • @adohertyd:是的,这就是我要做的。我也会放弃c,因为它不再需要(它仅用作循环计数器)。
  • 好的,所以我只是将 c 更改为 int 并且循环的工作方式相同。这更“正确”吗?我应该始终使用 int 变量,即使是 char[]?
  • @adohertyd:两个版本都是正确的,但我认为使用int 在风格上更好。请注意,用于索引数组的变量类型(例如words)与数组元素的类型无关。
  • @adohertyd 不,这不太正确。它只占用 4 倍的空间。在这种情况下,使用 int 可能更好,但有时空间要求很紧。假设您正在存储一个包含 10 亿个整数的列表,并且所有整数都小于 256。将它们全部存储为 int 将占用 4GB 内存,但将它们存储为 unsigned char 将占用 1GB。一般来说,这是可读性和浪费内存之间的权衡。
【解决方案2】:

数组就像一座建筑物,你有好几层楼,每一层都有一个数字。

1 楼住着约翰。 迈克尔住在 2 楼。

如果您想去 Jonh 公寓,请在电梯上按 1。如果你想去迈克尔家,请按 2。

数组也是如此。数组中的每个位置都存储一个值,在本例中是一个字母。

每个位置都有一个关联的索引。第一个位置是0。

当您想要访问数组的某个位置时,您可以使用 array[position] 其中position 是您想要访问的数组中的索引。

变量c 持有要访问的位置。当您执行 words[c] 时,您实际上是在访问数组中的 cnt 位置并检索其值。

假设这个词是cool

word[1] 导致oword[0] 导致 c

为了确定单词的结尾,将字符\n 设置在数组的最后一个位置。

【讨论】:

    【解决方案3】:

    不是真的,charint 是隐式转换的。

    在这种情况下,您可以将char 视为较小的intsizeof(char) == 1,所以它比int 小,这可能是它被使用的原因。以编程方式,在这种情况下没有区别,除非输入字符串很长,在这种情况下,char 将在 int 之前溢出。

    【讨论】:

    • 所以你说 char c = 0;因为它在 for 循环中的上下文而被转换为 int?
    • 嗯...实际上它们不仅仅在那里转换。使用operator [] 时可能会发生转换。您可以使用任何类型作为迭代器,对此没有限制。而且你可以直接将 char 转换为 int,反之亦然,因此 char c = 0 将 int 转换为 char
    【解决方案4】:

    数字文字(例如您的情况下的0)与char 类型的变量兼容。事实上,即使是用单引号括起来的字符文字(例如 '\n')也是 int 类型,但在分配或与另一个 char 比较时会隐式转换为 char

    数字字面量可以与字符字面量互换,只要前者不超出字符的范围。

    以下应该导致编译器警告:

    char c = 257;
    

    而这不会:

    char c = 127;
    

    【讨论】:

      【解决方案5】:

      A char 是 C 是整数类型,shortintlonglong long(以及许多其他类型)也是如此:

      它被定义为您正在编译的机器上的最小可寻址单元,通常为 8 位,这意味着它可以保存值 -128 到 127。无符号字符可以保存值 0 到 255。

      它在上面作为迭代器工作,因为它会一直在50 之前停止,并且它可以保存最多 127 的值。而 int 类型通常可以保存最多 2,147,483,647 的值,但占用 4 倍的空间在机器中作为 8 位字符。在 C 中,int 只能保证至少为 16 位,这意味着在 -32,768 和 32,767 之间的值或 0 - 6,5535 之间的值对于无符号整数。

      所以你的循环只是访问你数组中的元素,一个接一个地像words[0]在开始查看第一个字符,然后words[1]查看下一个字符。由于您使用 char,我假设它在您的机器上是 8 位,因为这很常见。您的 char 足以存储循环的迭代器,直到它超过 127。如果您读取超过 127 个字符(而不是仅 50 个)并使用 char 进行迭代,您会遇到奇怪的问题,因为 char 不能保持 128 并将循环到 -128。导致您访问words[-128],这很可能会导致分段错误。

      【讨论】:

        猜你喜欢
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 2013-05-15
        • 1970-01-01
        • 1970-01-01
        • 2014-06-04
        相关资源
        最近更新 更多