C 如何更改名称为用户输入的变量?

C 如何更改名称为用户输入的变量?,c,variables,C,Variables,例如,我有一个块: int nFirst, nSecond; char sInput[10]; printf("Which variable to change to 10?"); scanf("%s", &sInput); // BAD - inflexible and unmaintainable if(strcmp(sInput,"nFirst") ==0){ nFirst = 10; } else if (strcmp(sInput,"nSecond")==0) {

例如,我有一个块:

int nFirst, nSecond;
char sInput[10];
printf("Which variable to change to 10?");
scanf("%s", &sInput);
// BAD - inflexible and unmaintainable
if(strcmp(sInput,"nFirst") ==0){
    nFirst = 10;
}
else if (strcmp(sInput,"nSecond")==0) {
    nSecond =10;
}

有什么好办法吗?是否将字符串视为变量名?

您可以实现字典或包含“变量名”和值的二维数组之类的功能。接下来就是将数组元素设置为新值


除此之外:C#和其他面向对象语言可以通过反射实现这一点,但由于C本身不是面向对象的,所以您无法做到这一点(C++对此的支持似乎非常有限)。

另一种依赖于平台的方法是将所有变量放入共享库中,然后按名称访问它们。请看一下dlsym/dlopen函数

void* handle = dlopen("mysymbols.so", RTLD_LOCAL | RTLD_LAZY);
int* var = (int*) dlsym(handle, user_typed_name);
*var = 10; /* modify the variable */

您可以使用宏执行此操作:

#define MAYBESET(name) if (strcmp(sInput, #name) ==0 ){ name = 10; }
#name
是将
name
更改为字符串文字的真实值。

不,在C中没有“好”的方法。变量名(通常)不会保留在生成的机器代码中,只是为了支持调试。C没有内置机制将字符串值转换为对同名变量的引用

您必须手动将变量名映射到变量。您可以构建查找表,将字符串值与相应变量的地址相关联:

struct vn {
  char *varname;
  void *addr;
  Typeinfo t;
};
其中,
Typeinfo
是一些枚举或其他机制,用于编码变量的类型,使您具有

int foo;
double bar;
char *blurga;
struct vn varsByName[] = { {"foo", &foo, IntType}, 
                           {"bar", &bar, DoubleType}, 
                           {"blurga", blurga, CharPtrType} };

我不建议这样做

对于少量变量,您的算法应该表现良好。如果有许多变量可以改变,而不是两个变量,那么应该考虑另一种算法。在C语言中,使这一点清晰明了并不容易。 如果您真的希望更快,您可以创建一个哈希表或使用如下开关/大小写:

int First, Second; // Note that I got rid of your leading n
char sInput[10];
printf("Which variable to change to 10?");
scanf("%s", &sInput);
// BAD - inflexible and unmaintainable
// referring to character array overflow potential, I assume

switch (sInput[0])
{
     case 'F':
         if (0 == strcmp("irst", sInput+1) )
         {
              First = 10;
         } else 
         {
              // error
         }
         break;
    case 'S':
         if (0 == strcmp("econd", sInput+1) )
         {
              Second = 10;
         } else 
         {
              // error
         }
         break;
    default:
         // error
         break;
}
如果您不喜欢它的外观,那么可以使用宏(
#define
)使它看起来不那么大,但结果是一样的。您可以使用的另一个选项是编写一个小程序,输出该程序的源代码,该程序将处理所有重复和繁琐的部分


另一种方法是,如果所有变量都是同一类型的,则创建一个数组并输入它们的索引,而不是名称,但随后必须添加代码以检查输入的索引是否超出数组大小的范围。

Whoa,为什么要这样做?不能将字符串视为变量名称。你可以做一个散列映射ẇ字符串作为键,变量指针作为值。请注意,您使用strcmp()是错误的;它不返回
bool
,它返回
int
,其中
0
表示“字符串相等”。如何将所需的用户输入与程序的实现细节联系起来比当前代码更灵活、更易于维护?@OrCyngiser我看到它现在已更正,很好。此外,它是“函数”:在C中,没有方法。哎呀,看起来C++很难做到这一点(这里请阅读)。我将更新我的答案。这仍然是不灵活的,因为它要求在构建时为每个有效变量调用宏。它减少了可视代码占用,但无法解决海报要求的问题。此外,它消除了海报中使用的
else
子句的潜在巨大好处,提高了平均运行时间。