用指针算术打印字符串

printing strings with pointer arithmetics

我正在尝试使用 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;
    }

我的错误是什么? 谢谢。

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

这有什么问题:

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);
  }

鉴于此声明...

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

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

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

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

同样,表达式 *sz 等价于 sz[0]。那个在语义上还可以,但在风格上很差。同样,在风格上很差的是将两个单独的案例分开,而您可以通过使用 sz[randomBit] 到 select 要打印的字符串来用相同的代码覆盖两者。

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

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

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