我想知道如何在 if 语句中定义一个变量,然后在 if 语句中使用它。
像这样:
int a = 2;
if (a <= 1) {
char string[10] = "Jahr";
}
else {
char string[10] = "Jahren";
}
printf("%s", string);
答案 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 个字节这样的超小缓冲区是有风险的,除非您特别地知道它们将如何使用,否则请始终对它们慷慨解囊。