【问题标题】:printing strings with pointer arithmetics [closed]用指针算术打印字符串[关闭]
【发布时间】:2021-07-20 13:33:22
【问题描述】:

我正在尝试使用 rand() 打印随机单词。 我认为我在指针算法上犯了一个错误,因为我得到了一个奇怪的输出。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

    int main ()
    {
        srand(time(0));
        const int randomBit = rand() % 2;
        char * sz[] ={"good", "bad"};
    
        switch (randomBit)
        {
        case 0:
            for (char *i=*sz; *i<(sz+3); i++)
            {
                printf("%c", *i);
            }
            break;
    
        case 1:
            for (char *i=*(sz+3); *i!=0x0; i++)
            {
                printf("%c", *i);
            }
        break;
        
        default:
            break;
        }
    
        return 0;
    }

我的错误是什么? 谢谢。

【问题讨论】:

  • 这段代码读起来很痛苦。为什么不打印整个字符串?
  • 你可以编写单元测试,在一定程度上保证逻辑是正确的
  • 你将 *i 初始化为 *sz,然后检查 *i 是否小于 (sz+3)
  • @sirmeowsalot 描述您要输出的内容。
  • sirmeowsalot 1) “因为我得到了一个奇怪的输出。”并且不发布该输出或预期输出会吸引反对票。最好发布使用的输入(这里没有),看到输出,预期输出。 2) 节省时间,启用所有编译器警告以捕获*i&lt;(sz+3) 等问题。

标签: c pointers pointer-arithmetic


【解决方案1】:

鉴于此声明...

        char * sz[] ={"good", "bad"};

...此代码具有未定义的行为:

            for (char *i=*(sz+3); *i!=0x0; i++)

表达式*(sz+3)等价于sz[3],但数组sz只有两个元素,所以最大索引为1。

同样,表达式*sz 等价于sz[0]。那个在语义上还可以,但在风格上很差。同样,风格很差的是将两个不同的情况分开,而您可以使用 sz[randomBit] 选择要打印的字符串来使用相同的代码覆盖这两种情况。

此外,还不清楚您为什么要逐个字符地打印。也许这是任务的一部分,但在现实世界中,程序员可能会写......

    printf("%s", sz[randomBit]);

... 而不是整个 switch 语句。

【讨论】:

    【解决方案2】:

    您的代码非常复杂(而且是错误的)。

    这是怎么回事:

    int main()
    {
      srand(time(0));
      const int randomBit = rand() % 2;
      char* sz[] = { "good", "bad" };
    
      printf("%s\n", sz[randomBit]);    
      return 0;
    }
    

    或者如果您不允许在作业中使用 %s 格式说明符:

      for (char* i = sz[randomBit]; *i != 0;  i++)
      {
        printf("%c", *i);  // or putchar(*i);
      }
    

    【讨论】:

    • 在后一种情况下,printf 机制在 putchar 就足够了的情况下是多余的。
    • @stark 没错,但我想保持接近 OP 的代码。
    猜你喜欢
    • 2010-09-28
    • 2023-03-15
    • 1970-01-01
    • 2015-03-05
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    相关资源
    最近更新 更多