4

以下行有问题int (*f)(int, int) = (argv[2][0] == 'd'),在编译时说此处不允许声明。是否应该在开始时声明该行,有什么更好的方法可以做到这一点。任何建议将不胜感激?

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int encode(int ch, int key) { 
        if (islower(ch)) {
                ch = (ch-'a' + key) % 26 + 'a';
                ch += (ch < 'a') ? 26 : 0;
        }
        else if (isupper(ch)) {
                ch = (ch-'A' + key) % 26 + 'A';
                ch += (ch < 'A') ? 26 : 0;
        }
        return ch;
}

int decode(int ch, int key) { 
        return encode(ch, -key);
}

int main(int argc, char **argv) { 
        int ch;
        int key;

        if (argc < 2) {
                printf("USAGE: cipher <integer key> <encode | decode>\n");
                printf("Then, just type your text and it will automatically output the en/de crypted text! :)\n");
                return 1;
        }

        key = atoi(argv[1]);
        if (key < 1 || key > 25) {
                printf("Key is invalid, or out of range. Valid keys are integers 1 through 25.\n");
                return 1;
        }

        int (*f)(int, int) = (argv[2][0] == 'd') ? 
                decode : 
                encode;

        while (EOF != (ch=getchar()))
                putchar(f(ch, key));

        return 0;
}
4

4 回答 4

13

在 C(C99 之前)中,您必须在块的开头声明变量。

将您的代码编译为 C99,或更改代码以便f在块的开头声明。

于 2012-11-28T17:36:02.577 回答
2

在 c89/90 中,您必须在块的开头声明所有变量

但是在 c99 中,您可以-std=c99像这样编译代码:

gcc -Wall -std=c99 test.c -o test.out

于 2012-11-28T17:38:21.550 回答
2

除了 NPE 指出的部分,您可以使用typedef创建函数类型。像这样:

typedef void FunctionType (int, int);然后使用它(作为单独的类型)来创建函数指针。

让阅读变得轻松。

于 2012-11-28T17:38:28.903 回答
2

是否应该在开始时声明该行

在 C89 中,定义必须出现在块中的任何语句之前。如果确实移动它,则不必移动整行(当然,您不希望将整行移动到检查代码argv[2]有效之前)。只需移动 的定义f

    int ch;
    int key;
    int (*f)(int,int);

    ...

    f = (argv[2][0] == 'd') ? decode : encode;

任何更好的方法

在这种情况下不一定更好,但请注意,规则是​​块的开始,不一定是函数的开始。

所以,你可以写:

{
    int (*f)(int, int) = (argv[2][0] == 'd') ? 
            decode : 
            encode;

    while (EOF != (ch=getchar()))
            putchar(f(ch, key));
}
return 0;

你可以很容易地陷入关于这种编码风格的争论。有些人认为每个函数都应该预先定义它的所有变量,并且仅仅为了定义一个变量而引入一个块是混乱和/或混乱的。有些人(尤其是那些使用 C++ 和 C 的人)认为您应该将每个变量的范围限制为尽可能窄的一段代码,因为在函数开头定义所有内容是混乱和/或混乱的。但即使是他们也可能认为裸块过多。

于 2012-11-28T17:53:23.963 回答