【问题标题】:array subscript operator in for loop counterfor循环计数器中的数组下标运算符
【发布时间】:2010-11-13 00:02:23
【问题描述】:

我正在学习 C。在以下代码中,为什么在 for 循环中将“*ptr_str”替换为“ptr_str[i]”会截断?

/* 13L01.c: Initializing strings */
#include <stdio.h>
main()
{
 char str1[] = {'A', ' ',
 's', 't', 'r', 'i', 'n', 'g', ' ',
 'c', 'o', 'n', 's', 't', 'a', 'n', 't', '\0'};
  char str2[] = "Another string constant";
  char *ptr_str;
  int i;

  /* print out str2 */
  for (i=0; str1[i]; i++)
      printf("%c", str1[i]);
      printf("\n");
  /* print out str2 */
  for (i=0; str2[i]; i++)
      printf("%c", str2[i]);
      printf("\n");
   /* assign a string to a pointer */
   ptr_str = "Assign a strings to a pointer.";
   for (i=0; *ptr_str; i++)
       printf("%c", *ptr_str++);
   return 0;

}

【问题讨论】:

    标签: c arrays pointers for-loop


    【解决方案1】:
       // A, ok
       while (*ptr_str)
           printf("%c", *ptr_str++);
    
       // B, also ok
       for (i=0; ptr_str[i]; i++)
           printf("%c", ptr_str[i]);
    
       // C, works but ugly
       for (i=0; *ptr_str; i++)
           printf("%c", *ptr_str++);
    

    C 是你的形式,它是有缺陷的,因为我在这里什么都不做,所以 A 是一个改进的版本。如果你想使用 i,就像 B 一样。如果你同时使用 i 和 ptr_str,并在循环中增加它们,那么不会有任何好处。增加一个或另一个。

    【讨论】:

    • 我回答了,然后重读你的答案,发现你已经回答了,只是字数少了。所以+1
    • @gmiket 截断绝对不是 prt_str[i] 作为 for 循环中的测试的必然结果。请参阅我的 B) sn-p,它工作正常。
    • @Chris,谢谢你的回答也很好,所以我也为你+1!
    • // C,适用于 (i=0; *ptr_str; i++) printf("%c", *ptr_str++;);在我看来,这是一个毫无意义的结构。为什么不只是 for (; *ptr_str;) printf("%c", *ptr_str++);
    • @gmiket 我同意这是一个毫无意义的构造,我只提到它是因为那是您发布的代码!!!!您对 for (; *ptr_str;) printf("%c", *ptr_str++); 的建议只是我的一个稍微丑陋的版本 while (*ptr_str) printf("%c", *ptr_str++);两者都很好,并且可以工作。
    【解决方案2】:

    因为您正在推进ptr_str,然后将其视为一个数组并测试它是否指向第i 个成员的NULL。您基本上是在测试 ptr_str[i+i] 是否为 NULL 而不是 ptr_str[i]

    【讨论】:

    • ASCII NUL ('\0') 不是 NULL ((void *)0)。
    • @Chris: NULL 不一定是 (void*)0 它可能是 00L 或等效的,即使在普通 C 中。
    • @Jens - 我知道,但@kichik 想要 NUL 字符,即'\0'。即使使用NULL 可能编译和工作,区分两者仍然很重要(尤其是对于初学者)。
    • @Chris:当然。只是想说明NULL 的“真实”价值,即没有:) 至少没有什么可靠的。
    【解决方案3】:

    你的问题有点不清楚,但我想我明白了:

    在以下代码中,为什么在 for 循环中将“*ptr_str”替换为“ptr_str[i]”会截断?

    我想你的意思是改变这个:

    for (i=0; *ptr_str; i++)
        printf("%c", *ptr_str++);
    return 0;
    

    到这里:

    for (i=0; ptr_str[i]; i++)
        printf("%c", *ptr_str++);
    return 0;
    

    第二个被截断,因为你在推进i ptr_str,所以ptr_str的修改起始位置加上@的修改起始位置987654326@ 最终会过早地将您切断(或者更糟糕的是,有奇数个字符并溢出到不属于您的数据中)。第二个截断的例子等价于:

    for (i=0; ptr_str[i * 2]; i++)
        printf("%c", ptr_str[i]);
    return 0;
    

    现在你明白它为什么会被截断了吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      相关资源
      最近更新 更多