如何为字符串切换和大小写?

MOH*_*MED 0 c macros

我有以下代码

#define SWITCH(S) char *_S = S; if (0)
#define CASE(S) } else if (strcmp(_S, S) == 0) {switch(1) { case 1
#define BREAK }
#define DEFAULT } else {switch(1) { case 1

int main()
{
    char buf[256];

    printf("\nString - Enter your string: ");
    scanf ("%s", buf);

    SWITCH (buf) {
        CASE ("abcdef"):
            printf ("B1!\n");
            BREAK;
        CASE ("ghijkl"):
            printf ("C1!\n");
            BREAK;
        DEFAULT:
            printf ("D1!\n");
            BREAK;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我生成预处理器代码gcc -E,我将得到以下代码

int main()
{
    char buf[256];

    printf("\nString - Enter your string: ");
    scanf ("%s", buf);

    char *_S = buf;
    if (0) {
    } else if (strcmp(_S, "abcdef") == 0) {switch(1) { case 1:
        printf ("B1!\n");
        };
    } else if (strcmp(_S, "ghijkl") == 0) {switch(1) { case 1:
        printf ("C1!\n");
        };
    } else {switch(1) { case 1:
        printf ("D1!\n");
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

但是对于一些char *_S = buf;在代码中间定义的gcc 并不是wolcome并且可能提供编译错误

如何解决我的宏?

请不要建议定义char *_S为全局(out of the main)

unw*_*ind 8

完全删除宏,并以"扩展"方式写入,将声明移到顶部.这些宏是可怕的.

如果做不到这一点,请调整SWITCH以引入新的范围(第二个{).这当然会迫使你必须关闭两个范围,所以也许最后要添加一个SWITCH_END可憎的用来封装它.随你.

  • 我觉得你没有足够强烈地强调"恐怖",但无论如何我继续向上投票. (3认同)

Dav*_*eri 8

不好了!!!

我在这篇文章中写道这是一个笑话

不要使用它是非常可怕的,如果你想避免if-else你可以做而不折磨编译器,考虑使用字符串对:

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

int main(void)
{
    char buf[256];
    const char *ap[] = {
        "abcdef", "B1!\n",
        "ghijkl", "C1!\n",
        NULL    , "D1!\n",
    }, **p = ap;

    printf("\nString - Enter your string: ");
    scanf ("%s", buf);
    while (*p) {
        if (strcmp(buf, *p) == 0) break;
        p += 2;
    }
    printf("%s", *(++p));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)