【问题标题】:C - Convert string to variable nameC - 将字符串转换为变量名
【发布时间】:2015-10-25 01:35:15
【问题描述】:

如何将字符串转换为变量名?例如。我有一个字符串列表:

     "str1", "str2", "str3", etc.

还有一个结构:

struct my_struct {  
       int str1;  
       int str2;  
       int str3;  
} m = {5, 10, 15, ... etc};  

给定一个字符串"str2",我想打印与之关联的变量 名称m.str2。 C有没有办法做到这一点?

谢谢!

【问题讨论】:

标签: c string variables


【解决方案1】:

我会建议一个稍微简单一点的解决方案,尽管可能效率不高。

这是我在咨询我的一位教授后为一个项目提出的解决方案。

字符串本质上只是ASCII字符,包含变量名的C文件也可以这样理解。

因此,假设您有一个字符串列表,您希望将其转换为整数的变量名。

首先,在一个头文件中定义您的结构,该头文件可以被您目录中的所有文件访问,例如“struct.h”。

第一步是将字符串名称转换为各自的整数

只需创建一个名为 variable_names.h 的空标头,包含 struct.h,然后一劳永逸地在主文件中调用以下循环:

const char *strings[] = {"str1", "str2", ... }
fp = fopen("variable_names.h", "a");
fprintf(fp, "#ifndef FILE1_H \n");
fprintf(fp, "#define FILE1_H \n");
fprintf(fp, "extern int* m_integers = {");
int i;
for(i = 0; i < sizeof(strings) - 1; i++){ fprintf(fp, "m.%s,", strings[i]);}
fprintf(fp, "m.%s } ", strings[i+1])
fprintf(fp, "#endif");

现在您通过 m_integers 数组在结构中的字符串名称和值之间建立了线性映射。接下来是创建一些接受字符串名称并将其指向该整数的映射。我会使用 UTHASH,但肯定还有其他方法。

因此,在您的主文件中,

#include "uthash.h"
#include "variable_names.h"
...

struct opcode_table{
     char* opcode_key;
     int opcodes_val;
     UT_hash_handle hh;
 };
struct opcode_table *mapping = NULL;

struct opcode_table* s = NULL;
for (int i = 0; i  < opcode_size; i++){
  s = (struct opcode_table*) malloc(sizeof(*s)); 
  s->opcodes_key = strings[i]; // the string 
  s->opcode_val = m_integers[i]; // the integer
  HASH_ADD(hh,mapping, opcodes_key, sizeof(int),s);
}

^ 请在代码上放轻松,这只是一个可以做的粗略示例。我确信有一些错误,但我相信这应该有效。

作为概述,这个想法本质上是,您将 ascii 字符“m.string1”写入外部文件,一旦写入,就会通过结构定义解释为整数,从而产生您想要的结果。现在,您必须简单地在哈希表中查找字符串,然后在结构中得到整数。

另外,如果有人找到更好的方法或这种方法有缺陷,我将不胜感激。谢谢!

【讨论】:

    【解决方案2】:

    您想要的是 Smalltalk 语言在 1980 年代在其解释器中使用的内容,以及 Python 仍然使用 C 语言中的 TTY 命令外壳程序从字符串 char 创建对象变量的内容。

    我们通过使用带有嵌套结构的结构来实现这些。但是实际的变量名称从未真正声明过。然而,它们通过条件搜索在结构中存储的字符名称进行匹配,或者如果它不存在,则创建它们。

    如果它确实存在于结构列表中,它将有条件地找到()它及其存储的值,或者根据您的程序设计的目的分配它的值。

    令牌被用于 (tok)、(s)、(t)、(e) 和其他几个作为令牌流读取的前瞻,最好理解这方面的一个例子:

    if (tok == "IDENT";) {
    

    当它找到上面的标识符(来自 lex 的变量标记)标记时,它将向前查找并获取变量名称,然后创建它,执行其先行计算在另一个 char 类型定义之后包含另一个变量,例如“CHAR”或“FLOAT”(用于双精度)等。

    它现在所做的是有条件地设置所有内容,因为它被读入由 tok 令牌流分配的结构列表中。

    “CHAR”“x”“EQUALS”“INT”“5”“NEWL(对于\N)”“CHAR”“y”“EQUALS”“INT”“5”“NEWL”“PRNT”“CHAR” “x”“新”。

    所以基本上所有通过 void 函数的变量都被有条件地分配给一个结构列表,并且同样由它们存储它们的值。

    而且它不是你需要匹配它存储的变量名的变量。它只是它需要的单个 tok 变量的匹配,并且它是您需要的前瞻性--

    struct Var v; //--declared in .h then--
    if(tok == 'CHAR') //--and-- 
    v = {tok2, s, t} //
    

    “tok2”是您的 vars 字符名称,“s”和“t”是获取、计算和/或分配它们的前瞻。基本上,Python 使用一个名为 tok 的 C 变量来命名它们。然后匹配使它们既动态又易于 Python 使用。 atoi 和 strtod 也可以即时进行整数和双精度转换。它的高级东西。

    整个过程在早期的 ANCI C 中称为“扫描仪”和“计算器”。研究 Dennis Ritchie 和 Tobias Shrighner。事实上,Tobias 曾为多个口译员工作过。

    【讨论】:

      【解决方案3】:

      这是一种方法,请查看我编写的示例代码。我使用整数指针ptr 来做到这一点。

      #include <stdio.h>
      #include <string.h>
      const char *s[] = {"str1", "str2", "str3", "str4", "str5", "str6", "str7", "str8", "str9", "str10"};
      struct temp
      {
          int str1;
          int str2;
          int str3;
          int str4;
          int str5;
          int str6;
          int str7;
          int str8;
          int str9;
          int str10;
      }m = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
      
      main()
      {
          char str[10];
          int *ptr;
          int i;
          ptr = &m.str1;
          printf("enter string: \t");
          scanf("%s", str);
          for(i=0;i<10;i++)
          {
              if(strcmp(str,s[i]) == 0)
              {
                  break;
              }
          }
          printf("value = %d\n", *(ptr+i));
      
      }
      

      如有错误请指正。

      【讨论】:

      • 我想要一种避免 strcmp 的方法,因此检查是否有任何预处理器技巧
      • 如果你想在运行时给出字符串,那么预处理器技巧将不起作用。
      【解决方案4】:

      这是一种方法。

      if ( strcmp(str, "str2") == 0 )
      {
         // Use m.str2
      }
      

      这将是数百个变量的问题。在这种情况下,你必须想出一些其他的机制。

      【讨论】:

      • 我有数百个变量,所以这不会扩展。
      • @user2511788 使用宏或使用其他程序生成一些代码。您只需执行一次。
      【解决方案5】:

      这在 C 语言中根本不可能。
      查看这个问题了解更多详情。 How to return a variable name and assign the value of the variable returned in c

      引用 Wichert 的话,“我建议您重新考虑您正在尝试解决的问题,并检查是否有更好的方法来解决它。也许使用数组、映射或哈希表可能是适合您的替代方法。'

      【讨论】:

        【解决方案6】:

        在 C 中,您不能动态创建变量或符号名称

        【讨论】:

          猜你喜欢
          • 2011-03-24
          • 2011-08-27
          • 2010-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多