鱼C论坛

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

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

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

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

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

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

  4. void main(){
  5.        
  6.         int j = 1;
  7.         string str_1;

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

  14.         cout << str_2 << endl;
  15. }
复制代码


但是 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循环内的基本变量的定义的作用域,就在循环体内,而且每次循环都相当于定义作用域结束。否则为什么
  1. #include<iostream>
  2. using namespace std;

  3. void main(){
  4. int i=1;
  5. int i=2;        //重复定义,不允许:
  6.                         //error C2374: 'i' : redefinition; multiple initialization
  7.                         //see declaration of 'i'
  8. }
复制代码

这样就提示重复定义,而
  1. #include<iostream>
  2. using namespace std;

  3. void main(){
  4.         while(1){
  5.                 int i=1;
  6.                 i++;
  7.         }
  8. }
复制代码

就可以正常编译和运行。
所以,while循环体内的变量如果做定义,每次循环都会作用域结束。

好,明白了以上这几点,我们就可以来实现程序啦:

  1. #include<iostream>
  2. # include<string>
  3. using namespace std;

  4. void main(){
  5.         
  6.         int j = 1;
  7.         string str_1;
  8.                
  9.                 char str_2[]="0";        //循环体外进行数组定义,并赋值初始化
  10.                
  11.         while( j){
  12.                         cin >> str_1;
  13.                         if     ( str_1 == "1"){ str_2[0] = '1'; j=0; }
  14.                         else if( str_1 == "2"){ str_2[0] = '2'; j=0; }
  15.                         else                  { cout<<"没有这个选项,请重新输入:" << endl; }
  16.         }
  17.                
  18.         cout << str_2 << endl;
  19. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-1-15 12:49:05 | 显示全部楼层
先初始化一下
小甲鱼最新课程 -> https://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循环内的基本变量的定义的作用域,就在循环体内,而且每次循环都相当于定义作用域结束。否则为什么
  1. #include<iostream>
  2. using namespace std;

  3. void main(){
  4. int i=1;
  5. int i=2;        //重复定义,不允许:
  6.                         //error C2374: 'i' : redefinition; multiple initialization
  7.                         //see declaration of 'i'
  8. }
复制代码

这样就提示重复定义,而
  1. #include<iostream>
  2. using namespace std;

  3. void main(){
  4.         while(1){
  5.                 int i=1;
  6.                 i++;
  7.         }
  8. }
复制代码

就可以正常编译和运行。
所以,while循环体内的变量如果做定义,每次循环都会作用域结束。

好,明白了以上这几点,我们就可以来实现程序啦:

  1. #include<iostream>
  2. # include<string>
  3. using namespace std;

  4. void main(){
  5.         
  6.         int j = 1;
  7.         string str_1;
  8.                
  9.                 char str_2[]="0";        //循环体外进行数组定义,并赋值初始化
  10.                
  11.         while( j){
  12.                         cin >> str_1;
  13.                         if     ( str_1 == "1"){ str_2[0] = '1'; j=0; }
  14.                         else if( str_1 == "2"){ str_2[0] = '2'; j=0; }
  15.                         else                  { cout<<"没有这个选项,请重新输入:" << endl; }
  16.         }
  17.                
  18.         cout << str_2 << endl;
  19. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


小甲鱼最新课程 -> https://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”而不是其 ...


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 23:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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