枚举和字符串

时间:2014-12-30 09:16:32

标签: c string enums

int main()
{     
    enum a {cat, dog, elephant};
    enum a b;

    b=dog;
    if (b==dog) printf("Y"); else printf("N");

    return 0;
}

上述程序有效。它显示Y。但是我觉得它不是很有用,所以我想做类似的东西,但是用字符串:

int main()
{     
    enum a {cat, dog, elephant};
    enum a b;

    char s[100];
    gets(s);

    b=dog;
    if (b==s) printf("Y"); else printf("N");

    return 0;
}

即使s=="dog",它也不起作用。

3 个答案:

答案 0 :(得分:0)

它不起作用,因为您将枚举与指针进行比较。

虽然char s[100]确实可以包含字符串,但s只是指向字符串开头的内存位置。换句话说,s是一个100字节长的内存块。

答案 1 :(得分:0)

您可以使用C preprocessor播放X-macros诀窍(请参阅例如this)。

你可以让一个宏在每只动物上调用一些宏P

#define DO_ANIMALS(P) \
  P(cat) \
  P(dog) \
  P(elephant)

然后用它来声明enum

enum animals_en {
#define DECLARE_ANIMAL(An) En,
DO_ANIMALS(DECLARE_ANIMAL)
};

以后用它将字符串s转换为enum animals_en

enum animals_en convert_string_to_animal(const char*s) {
#define CHECK_STRING_ANIMAL(An) if (!strcmp(s, #An)) return An;
DO_ANIMALS(CHECK_STRING_ANIMAL)
   fprintf(stderr, "bad animal %s\n", s); exit(EXIT_FAILURE);
} 

您可能希望查看使用gcc -Wall -C -E yoursource.c > yoursource.i获得的预处理表单,然后在生成的yoursource.i上使用一些编辑器或寻呼机来了解其工作原理。

阅读GNU cpp的文档,特别是stringification& concatenation

您还可以改进此代码以生成类似于the answer from Vlad from Moscow的内容。

这些技巧既可以在C语言中使用,也可以在C ++中使用,但更像是C语言。 (在C ++ 11中,你宁愿尝试使用模板)。

答案 2 :(得分:0)

尝试以下方法

#include <stdio.h>
#include <string.h>

int main(void) 
{
    enum Animal { cat, dog, elephant };
    char * animal_name[] = { "cat", "dog", "elephant" };
    enum Animal b;
    size_t n;

    char s[100];
    fgets( s , sizeof( s ), stdin );

    n = strlen( s );
    if ( s[n - 1] == '\n' ) s[n - 1] = '\0';

    b = dog;
    if ( strcmp( animal_name[b], s ) == 0 ) printf( "Y\n" ); 
    else printf( "N\n" );

    return 0;
}

如果要输入dog,则输出为

Y

在比较字符串之前,您可以将输入的字符串转换为在动物名称数组的字符串中使用的小写字母。

或者您可以使用C#而不是C,其中枚举数可以转换为字符串。 :)