【问题标题】:global and local variable全局变量和局部变量
【发布时间】:2016-02-28 06:59:48
【问题描述】:
#include<>
int calc(int,int,char);
void main()
{
    int a,b;
    char c;
    printf("enter 2 nos");
    scanf("%d%d",&a,&b);
    printf("enter op");
    scanf("%s",&c);
    printf("the ans is %d\n",calc(a,b,c));
}
int calc(int a,int b,char c)
{
    int ans;
    switch(c)
    {
        case'+':ans=a+b;break;
        case'-':ans=a-b;break;
    }
    return ans;
}

为什么这个程序将输出作为 b...当我将 a、b 和 c 作为全局变量时它可以工作...如果我希望它们作为局部变量我应该做什么改变...使用函数

【问题讨论】:

标签: c global local


【解决方案1】:

scanf("%s",&amp;c); 导致未定义的行为。您正在存储至少两个字符['+', '\0'],并且您只为一个分配了空间。

您可以考虑scanf(" %c", &amp;c);。请注意,我特意在格式字符串中添加了一个空格,以吃掉用户可能包含的任何空格。

【讨论】:

  • 但是当我将 a 和 b 声明在 main 之外时它会起作用..我的意思是作为全局变量
  • 如果它是一个全局变量,它仍然是未定义的行为。未定义行为的一个可能结果是您的代码似乎可以工作。
  • 当我在 main 中声明 a、b 和 c 时,我希望它能够工作。我该怎么做?
  • @AishwaryaShah 遵循此答案中的建议
【解决方案2】:
char c;
...
scanf("%s",&c);

这是完全错误的,即使c 是一个全局变量。

您的scanf 将从键盘输入并将您键入的字符串存储在作为第二个参数给出的地址(在您的情况下为c 的地址)。但是c 只能容纳一个字符,而使用scan 输入的字符串至少需要2 个字符(您键入的字符和以0 结尾的字符)。

在您的情况下,您会得到未定义的行为,这意味着您的程序可能

  • 似乎在工作
  • 每次运行都会崩溃
  • 似乎与您键入的某个字符串一起工作,但与另一个字符串一起崩溃
  • 或任何其他奇怪的行为

你需要这个:

char c[10];
...
scanf("%9s",c);
...
printf("the ans is %d\n",calc(a,b,c[0]));

允许您输入长度为 9 的字符串(9 个字符 + 终止零 = 10)。

【讨论】: