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”没有首先声明。我是数组新手。我想要做的是在用户输入字母 s 时显示字符串“suave”。

4

5 回答 5

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 
于 2013-08-01T14:47:59.753 回答
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() 返回一些东西。

于 2013-08-01T14:48:22.267 回答
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 语法中,声明不是语句。的语法ifif (expression) statement [else statement]. 没有大括号的 if 中的单个“语句”必须是语句。它可能不是一个声明。它可以是一个复合语句,它是一个大括号括起来的块项列表块项列表可以是或包含一个声明

所以这里的声明是完全非法的。您不能yif-statement没有大括号的情况下声明。

但是如果你添加大括号:

if (x == 's') { char y[] = "sauve"; }
else { char y[] = "hi"; }

printf("%s",y); 

这在理论上是合法的,但现在有一个新问题......现在的声明y现在被限制在{ ... }范围内。会出现 : 类型的错误error: use of undeclared identifier 'y'printf行了。

于 2013-08-01T14:51:50.893 回答
-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();
   }

这能解释发生了什么吗?

于 2013-08-01T14:47:29.100 回答
-1

如果范围不在主函数中,则您的数组声明在。因此,您无法访问它们。在 main 函数的开头声明它。这对数组来说没什么特别的。从技术上讲,在 C89 中,所有变量都定义在范围的开头,C++ 允许在范围内的任何位置声明变量。(感谢 larsmans 的评论。我认为应该更新许多教科书和博客条目。)

于 2013-08-01T14:45:25.803 回答