如何使用 if 语句中的 if 语句变量?

时间:2021-03-23 13:21:45

标签: c

我想知道如何在 if 语句中定义一个变量,然后在 if 语句中使用它。

像这样:

    int a = 2;

    if (a <= 1) {
        char string[10] = "Jahr";
    }
    else {
        char string[10] = "Jahren";
    }

    printf("%s", string);

4 个答案:

答案 0 :(得分:2)

您不能在 if 语句(或其他复合块)内声明变量并在其范围之外使用它。

如果需要外部的值,则必须声明一个适当的变量并在 if 语句中对其进行赋值。

在您的示例中,这看起来像这样:

char string[10];

if (a <= 1)
    strcpy(string, "Jahr");
else
    strcpy(string, "Jahren");

printf("%s\n", string);

答案 1 :(得分:0)

您可以通过声明要用作 static 的值并取出指向该值的指针来实现。标记为 static 可防止变量在退出作用域时消失。

    int a = 2;
    char* pString;

    if (a <= 1) {
        static char string[10] = "Jahr";
        pString = string;
    }
    else {
        static char string[10] = "Jahren";
        pString = string;
    }

    printf("%s", pString);

我认为最好在 if 语句外声明一个变量并将数据复制到 if 语句内。

    int a = 2;
    char string[10];

    if (a <= 1) {
        strcpy(string, "Jahr");
    }
    else {
        strcpy(string, "Jahren");
    }

    printf("%s", string);

在代码顶部添加 #include <string.h>(如果尚不存在)以使用 strcpy()

答案 2 :(得分:0)

简单的解决方案是:

int a = 2;
const char* str;

if (a <= 1) {
    str = "Jahr";
}
else {
    str = "Jahren";
}

puts(str);

可选,以防您需要稍后写入字符串:

const char* STR_TABLE[] =
{
  "Jahr",
  "Jahren"
};

int a = 2;
size_t i;
if (a<=1)
{
  i = 0;
}
else
{
  i = 1;
}

size_t size = strlen(STR_TABLE[i]) + 1;

char rwstr [size]; // or just allocate it "large enough", couple of hundred bytes
memcpy(rwstr, STR_TABLE[i], size);

puts(rwstr);

缓冲区溢出的问题不存在,因为没有用户输入。

编译器甚至能够在编译时解决所有这些问题。当我在 gcc x64 上运行它并优化时,它只是将一些与 ASCII 对应的幻数扔到缓冲区中,然后调用 puts

答案 3 :(得分:-2)

如果你在一个作用域内声明一些东西,它只存在于该作用域内,并且一旦该块退出就会有效地消失。

要解决此问题,请在直接范围之外将其向上声明一级:

int a = 2;
const int LENGTH = 10;       // Define the buffer length clearly
char string[LENGTH] = { 0 }; // Zero out buffer to start

if (a <= 1) {
  strncpy(string, "Jahr", LENGTH - 1);
}
else {
  strncpy(string, "Jahren", LENGTH - 1);
}

printf("%s", string);

注意这里使用 LENGTH 作为常量,这样您就知道缓冲区有多大。 sizeof(string) 可以在某些上下文中工作,但是如果在进行函数调用时它衰减为指针,则该信息将丢失,因此需要单独传入。进入只是一个好习惯。更改该值将更改所有使用它的位置,而不必搜索并替换所有位置。

如果你过度承诺,​​它仍然是安全的:

const int LENGTH = 10;
char string[LENGTH] = { 0 };

strncpy(string, "my spoon is too big", LENGTH - 1);

printf("%s", string);

在这里你得到 my spoon 作为输出。

<块引用>

提示:使用诸如 strncpy() 之类的抗缓冲区溢出函数,这样可以避免在无意中溢出某些内容时造成混乱。使用像 10 个字节这样的超小缓冲区是有风险的,除非您特别地知道它们将如何使用,否则请始终对它们慷慨解囊。

相关问题