#include <stdio.h>
int main(){
char x;
printf("enter something ");
scanf("%c",&x);
if(x == 's') char y[] = "sauve";
else char y[] = "hi"
printf("%s",y);
getch();
}
它表示“y”未首先声明。我是阵列的新手。我想要做的是当用户输入字母s时显示字符串“suave”。
答案 0 :(得分:4)
喜欢:
char *y;
if(x == 's') y = "sauve";
else y = "hi";
printf("%s",y);
否则你必须使用strcpy()
并在if:
char y[SIZE] = ""; //1. sufficiently long size
if(x == 's')
strcpy(y, "sauve"); //2. after declaration you can't assign used strcpy
else
strcpy(y, "hi");
printf("%s", y); //3. now scope is not problem
答案 1 :(得分:2)
您的代码转换为
#include<stdio.h>
int main() {
char x;
printf("enter something ");
scanf("%c",&x);
if(x == 's') {
char y[] = "sauve";
} else {
char y[] = "hi";
}
printf("%s",y);
getch();
}
现在看起来更加明显,你声明的变量'y'被绑定到它声明的{...}范围。你不能在它声明的范围之外使用'y'。要修复这个,在外部范围内声明'y',如下所示:
#include<stdio.h>
int main() {
char x;
printf("enter something ");
scanf("%c",&x);
const char *y;
if(x == 's') {
y = "sauve";
} else {
y = "hi";
}
printf("%s",y);
getch();
return 0;
}
还要注意我如何使用指针而不是数组,因为定义'y'时无法知道数组的大小。另外不要忘记从main()返回一些内容。
答案 2 :(得分:2)
请改用:
char *y;
if(x == 's') y = "sauve";
else y = "hi";
printf("%s",y);
通过在y
语句之前声明if
而不在内部,您正在扩展y
范围。你不需要括号。
编辑:(来自Eric和Carl的评论)
if (x == 's') char y[] = "sauve";
else char y[] = "hi";
printf("%s",y);
在C语法中,声明不是声明。
if
的语法是if (expression) statement [else statement]
。如果没有大括号,单个“语句”必须是一个语句。它可能不是声明。它可以是复合语句,它是大括号括起来的block-item-list , block-item-list 可以是或包含声明。
所以这里的声明完全是非法的。您无法在没有大括号的y
中声明if-statement
。
但是如果你添加大括号:
if (x == 's') { char y[] = "sauve"; }
else { char y[] = "hi"; }
printf("%s",y);
这在理论上是合法的,但现在有一个新问题...... y
的声明现在与{ ... }
范围有关。 error: use of undeclared identifier 'y'
行上会出现类型错误:printf
。
答案 3 :(得分:-1)
如果范围不在main函数中,则表示数组声明。因此您无法访问它们。在main函数的开头声明它。这对数组来说并不特别。从技术上讲,在C89中,所有变量都是在作用域的开头定义的,C ++允许在作用域的任何地方声明变量。 (感谢larsmans的评论。我认为应该更新许多教科书和博客文章。)
答案 4 :(得分:-1)
如果我加入blocks {}
我们得到:
#include<stdio.h>
int main(){
char x;
printf("enter something ");
scanf("%c",&x);
if(x == 's') { char y[] = "sauve";}
else {char y[] = "hi";}
printf("%s",y); /* y is now out of scope of both its declarations*/
getch();
}
这能解释发生了什么吗?