【问题标题】:Why don’t we need for loop to print strings in C?为什么我们不需要 for 循环来打印 C 中的字符串?
【发布时间】:2019-10-28 21:13:33
【问题描述】:

我不明白为什么我们不必在 for 循环中打印字符串?在正常情况下,我们需要在 for 循环中打印数组。例如,如果我们要打印整数数组。会是这样的:

int a[n];

for (i = 0; i < n; i++){
    printf("%d", a[i]);
}

但是对于像这样的字符串:

char s[100] = " Hello ";
printf("%s\n", s);

写数组名就够了。 编辑:似乎我没有正确地问我的问题,因为你们中的一些人写了与我的问题无关的答案。我编辑我的问题。

【问题讨论】:

  • 因为 C 中的字符串以特殊字符 '\0' 终止,这让程序知道它在哪里结束。
  • 任何体面的初学者教程都应该涵盖这一点。也许您需要更好的书/资源或您正在使用的任何资源。
  • 就像其他人所说的那样。如果您在 linux 系统中深入了解 printf(及其相关功能),您应该能够键入“man 3 printf”。或者,you can read about it here.
  • 您当然可以这样做,下面提供了许多示例。调用 printf 是有代价的。成本在于 printf 本身。因此,尽可能少地调用 printf 是很好的。您可以尝试逐个字符并一起打印一个大字符串,然后比较它们的速度。
  • 还有一个循环但它在printf()里面。

标签: c string pointers printf size


【解决方案1】:

字符串以空字符'\0' 结尾,即使没有明确传递其长度,也可以知道字符串何时结束。

【讨论】:

    【解决方案2】:

    不同之处在于 C 风格的字符串(即 char 数组)以零结尾,而 int 数组通常不以零结尾。

    理论上,您还可以创建一个以零结尾的 int 数组并在循环中打印:

    int a[] = {5,7,3,0};
    
    for (i=0;a[i]!=0;i++)
    {
       printf("%d",a[i])
    }
    

    但是,以零结尾的 int 数组的问题在于数字 0 可能是一个有意义的值,因此当您遇到该值时,您无法确定它是否真的是数组的末尾。但是,对于字符串,ASCII-Code0 并不代表有意义的值,因此您可以合理地确定您已到达字符串的末尾。

    【讨论】:

      【解决方案3】:

      你的例子远非类似。 %d 指的是一个单个 整数,而%s 指的是整个(但仍然是单个)字符串。

      您也没有将数组n[] 的大小传递给printf - 而是调用printf n 次。您正在打印一个int,就像您正在打印一个字符串一样。

      实际字符串长度未知先验,而是printf 迭代字符串直到遇到\0 终止符。相当于:

      for( int i = 0; s[i] != '\0'; i++)
      {
          printf( "%c", s[i] ) ;
      }
      

      因为

      char s[100] = " Hello ";
      

      相当于:

      char s[100] = { ' ', 'H', 'e', 'l', 'l', 'o', ' ', '\0' } ;
      

      【讨论】:

      • @subhanceo 欢迎您,但由于您稍微改变了问题,因此答案不太有意义。
      【解决方案4】:

      字符串同时是多个字符。您不能要求字符串中的特定字符。如果你想这样做,你必须把它称为一个像这样的字符数组

      for (i = 0; i < n; i++){
           printf("%c", s[i]);
      }
      

      【讨论】:

        【解决方案5】:

        这是因为您已经向 printf 函数提供了参数“%s”,该函数已经有一个定义告诉它如何打印字符串。 希望对您有所帮助。

        【讨论】:

          【解决方案6】:

          其中一个原因是 char 只占用 1 个字节的内存,当你按下一个字符时,数组的第一个索引完全填满,它会移动到下一个索引,直到遇到 NULL 字符。对于大小超过 1 个字节且取决于机器的整数数组,情况并非如此。所以你不能通过按下小于最大范围的数字来逃避第一个索引。如果您尝试这样做,它只会将您的数字存储在第一个索引中,因此那里需要一个 for 循环。

          【讨论】:

            猜你喜欢
            • 2019-08-21
            • 1970-01-01
            • 2019-12-23
            • 2016-01-14
            • 1970-01-01
            • 2022-11-13
            • 1970-01-01
            • 2014-02-17
            • 2012-01-03
            相关资源
            最近更新 更多