如何将字符串转换为变量名?例如。我有一个字符串列表:
"str1", "str2", "str3", etc.
结构:
struct my_struct {
int str1;
int str2;
int str3;
} m = {5, 10, 15, ... etc};
给定字符串"str2"
,我想打印与之关联的变量
名称m.str2
。 C有什么办法吗?
谢谢!
答案 0 :(得分:8)
这在C.中根本不可能 查看此问题以获取更多详细信息。 How to return a variable name and assign the value of the variable returned in c
引用Wichert的话,'我建议你重新考虑你想要解决的问题,并检查是否有更好的方法来解决它。也许使用数组,映射或散列表可能是一种适合您的替代方法。'
答案 1 :(得分:4)
在C中,您无法动态创建变量或符号名称。
答案 2 :(得分:3)
这是一种方式。
if ( strcmp(str, "str2") == 0 )
{
// Use m.str2
}
这将是数百个变量的问题。在这种情况下,你必须提出一些其他的机制。
答案 3 :(得分:0)
这是一种方法,请查看我编写的示例代码。我使用整数指针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));
}
如果有任何错误,请纠正我。
答案 4 :(得分:0)
您想要的是Smalltalk语言在1980年的解释器中使用的内容;以及Python仍在通过TTY Command Shell Program用C语言从字符串char创建对象变量的方式。
我们通过将结构与嵌套结构一起使用来完成这些操作。但是实际的变量名称实际上从未声明过。但是,通过在结构中搜索存储的char名称进行条件搜索来匹配它们,或者如果不存在,则会创建它们。
如果它确实存在于结构体列表中,它将有条件地查找()它及其存储的值,或者根据程序设计要执行的操作分配其值。
通过将令牌用于(tok),(s),(t),(e)以及令牌流读入的其他一些符号,可以最好地理解此示例:
if (tok == "IDENT";) {
当它如上所述找到标识符(来自lex的变量标签)标记时,它将向前查找并获取变量名称,然后创建它,执行其前瞻性计算,并在另一个char类型定义(例如)之后包含另一个变量“ CHAR”或“ FLOAT”(双精度)等。
现在要做的是有条件地设置所有内容,因为这些内容将被读到tok令牌流分配的结构列表中。
“ CHAR”“ x”“等于”“ INT”“ 5”“ NEWL(用于\ N)”“ CHAR”“ y”“等于”“ INT”“ 5”“ NEWL”“ PRNT”“ CHAR” “ x”“ NEWL”。
因此,基本上所有通过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也可以即时进行整数和doublke转换。它的高级功能。
整个过程在早期ANCI C中被称为“扫描仪”和“计算器”。研究Dennis Ritchie和Tobias Shrighner。实际上,Tobias从事过几种口译员的工作。