鱼C论坛

 找回密码
 立即注册
查看: 1236|回复: 4

[已解决]变量作用域问题

[复制链接]
发表于 2019-1-15 12:10:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我想实现一个选择功能,因此有以下代码
#include<iostream>
# include<string>
using namespace std;

void main(){
        
        int j = 1;
        string str_1;

        while( j){ 
                cin >> str_1;
                if     ( str_1 == "1"){ char str_2[] = "1"; j=0; }
                else if( str_1 == "2"){ char str_2[] = "2"; j=0; }
                else                  { cout<<"没有这个选项,请重新输入:" << endl; }
        }

        cout << str_2 << endl;
}

但是 cout << str_2 << endl; 报错了, 报错内容为 undeclared identifier
我该如何实现这个功能使得str_2可以被调用?我所使用的IDE是VC6.0。
最佳答案
2019-1-15 13:13:26
本帖最后由 行客 于 2019-1-15 15:07 编辑

首先要留意一个坑:字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字符一个字符地赋值了。

C语言规定,可以将字符串直接赋值给字符数组。我们给字符数组赋值时,我们通常使用这种写法,将字符串一次性地赋值(可以指明数组长度,也可以不指明),而不是一个字符一个字符地赋值,那样做太麻烦了。

但是我刚刚开始就说到了一个坑,后面再想将整个字符串一次性地赋值就不能使用了。也就是:
char str_2[]="abc";
这样的赋值是可以的;但是在其之后再想一次性赋值:
str_2[]="cde";
这样就不可以了,只能
str_2[0]='c';str_2[1]='d';str_2[2]='3';

那么好,我们解决了这个问题,你说的作用域就不是问题了:

while循环内的基本变量的定义的作用域,就在循环体内,而且每次循环都相当于定义作用域结束。否则为什么
#include<iostream>
using namespace std;

void main(){
int i=1;
int i=2;        //重复定义,不允许:
                        //error C2374: 'i' : redefinition; multiple initialization
                        //see declaration of 'i'
}
这样就提示重复定义,而
#include<iostream>
using namespace std;

void main(){
        while(1){ 
                int i=1;
                i++;
        }
}
就可以正常编译和运行。
所以,while循环体内的变量如果做定义,每次循环都会作用域结束。

好,明白了以上这几点,我们就可以来实现程序啦:
#include<iostream>
# include<string>
using namespace std;

void main(){
        
        int j = 1;
        string str_1;
                
                char str_2[]="0";        //循环体外进行数组定义,并赋值初始化
                
        while( j){ 
                        cin >> str_1;
                        if     ( str_1 == "1"){ str_2[0] = '1'; j=0; }
                        else if( str_1 == "2"){ str_2[0] = '2'; j=0; }
                        else                  { cout<<"没有这个选项,请重新输入:" << endl; }
        }
                
        cout << str_2 << endl;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-15 12:49:05 | 显示全部楼层
先初始化一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-15 13:13:26 | 显示全部楼层    本楼为最佳答案   
本帖最后由 行客 于 2019-1-15 15:07 编辑

首先要留意一个坑:字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字符一个字符地赋值了。

C语言规定,可以将字符串直接赋值给字符数组。我们给字符数组赋值时,我们通常使用这种写法,将字符串一次性地赋值(可以指明数组长度,也可以不指明),而不是一个字符一个字符地赋值,那样做太麻烦了。

但是我刚刚开始就说到了一个坑,后面再想将整个字符串一次性地赋值就不能使用了。也就是:
char str_2[]="abc";
这样的赋值是可以的;但是在其之后再想一次性赋值:
str_2[]="cde";
这样就不可以了,只能
str_2[0]='c';str_2[1]='d';str_2[2]='3';

那么好,我们解决了这个问题,你说的作用域就不是问题了:

while循环内的基本变量的定义的作用域,就在循环体内,而且每次循环都相当于定义作用域结束。否则为什么
#include<iostream>
using namespace std;

void main(){
int i=1;
int i=2;        //重复定义,不允许:
                        //error C2374: 'i' : redefinition; multiple initialization
                        //see declaration of 'i'
}
这样就提示重复定义,而
#include<iostream>
using namespace std;

void main(){
        while(1){ 
                int i=1;
                i++;
        }
}
就可以正常编译和运行。
所以,while循环体内的变量如果做定义,每次循环都会作用域结束。

好,明白了以上这几点,我们就可以来实现程序啦:
#include<iostream>
# include<string>
using namespace std;

void main(){
        
        int j = 1;
        string str_1;
                
                char str_2[]="0";        //循环体外进行数组定义,并赋值初始化
                
        while( j){ 
                        cin >> str_1;
                        if     ( str_1 == "1"){ str_2[0] = '1'; j=0; }
                        else if( str_1 == "2"){ str_2[0] = '2'; j=0; }
                        else                  { cout<<"没有这个选项,请重新输入:" << endl; }
        }
                
        cout << str_2 << endl;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-15 14:02:45 | 显示全部楼层
本帖最后由 小休克 于 2019-1-15 14:05 编辑
行客 发表于 2019-1-15 13:13
首先要留意一个坑:字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字符 ...


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-15 14:04:00 | 显示全部楼层
本帖最后由 小休克 于 2019-1-15 14:06 编辑
小休克 发表于 2019-1-15 14:02
我试着运行了一下,str_2 的输出值是“0”而是不是“1”或“2”,我想要str_2输出是“1”或“2”而不是其 ...


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 04:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表