用指针算术打印字符串

时间:2021-07-20 13:33:22

标签: c pointers pointer-arithmetic

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

我的错误是什么? 谢谢。

2 个答案:

答案 0 :(得分:3)

鉴于此声明...

<块引用>
        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 语句。

答案 1 :(得分:1)

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

这是怎么回事:

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);
  }
相关问题