颠覆一个词+一个大红包(bug)

问题描述 投票:-1回答:1

刚开始接触C语言,写了这段代码来倒装单词,但是我发现了一个小东西,不知道是BUG还是语言的未来。

这段代码的目的是这样的。

简单的输入 欢迎

简单输出:emoclew

代码工作正常,但当我们定义了变量 patrol 在变量前 size 程序无法运行。另外,如果你定义了一个变量 counter 在变量之后 size 和变量 patrol 在变量前 size 程序就能正常运行。

问题是:为什么会出现这种情况?

#include <stdio.h>

int main(void)
{
  char name[ 100 ];
  int counter;
  int size;
  int patrol = 0;

  for (counter = 0; counter < size; counter++, patrol++)
      {
        name[ counter ] = getchar();
        size = sizeof(name);

        if (10 == name[ counter ])
            {
              break;
            }
      }

        for(counter = patrol; counter >= 0; counter--)
            {
              printf("%c", name[ counter ]);
            }
              printf("\n");

  return 0;
}// end of main

c arrays reverse sizeof
1个回答
2
投票

这个循环

for (counter = 0; counter < size; counter++, patrol++)

调用未定义的行为,因为变量 size 在循环之前没有初始化

int size;

本声明

size = sizeof(name);

并不是很合理,因为 sizeof(name) 总是产生 100 即声明数组的大小 name

char name[ 100 ];

在这个if语句中

if (10 == name[ counter ])

宜用 '\n' 而不是魔数 10.

还有这句话

name[ counter ] = getchar();

在数组中存储新的行字符 name.

程序的样子可以是这样的。

#include <stdio.h>

int main(void)
{
    enum { N = 100 };
    char name[ N ];

    int c;
    int i = 0;

    while ( i < N && ( c = getchar() ) != EOF && c != '\n' )
    {
        name[i++] = c;
    }

    while ( i != 0 )
    {
        putchar( name[--i] );
    }

    putchar( '\n' );

    return 0;
}

如果要进入

Hello Eryano

那么程序输出将是

onayrE olleH

0
投票

我建议使用以下代码。考虑看看吧:-

#include<stdio.h>

int main()  {
    int counter,size=0;
    char name[100];

    printf("\nEnter a text : ");
    while(1)    {                        // Iterates until 'Enter' is pressed.
        name[size++] = getchar();
        if(name[size-1]=='\n')  break;
    }
    name[--size]='\0';                   // Null character added to complete string...

    printf("\nReverse text : ");
    for(counter=size-1;counter>=0;counter--)    {
        printf("%c",name[counter]);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.