2

我正在使用 strcmp 来比较 C++ 中的字符数组,但每次出现 strcmp 时都会出现以下错误:错误:从 'int' 到 'const char*' 的无效转换,后跟:错误:初始化参数 2 of 'int strcmp (常量字符*,常量字符*)'

我已经包含了 string、string.h 和 stdio.h,这是我的代码,感谢所有回复的人。

此外,除了一堆 if 语句之外,还有更好的方法来检查缓冲区吗?


int main(int argc, char* argv[])
{
    unsigned count = 0;
    bool terminate = false;
    char buffer[128];

do {
    // Print prompt and get input
    count++;
    print_prompt(count);
    cin.getline(buffer, 128);

    // check if input was greater than 128, then check for built-in commands
    // and finally execute command
    if (cin.fail()) {
        cerr << "Error: Commands must be no more than 128 characters!" << endl;
    }
    else if ( strcmp(buffer, 'hist') == 0 ) {
        print_Hist();
    }
    else if ( strcmp(buffer, 'curPid') == 0 ) {
        // get curPid
    }
    else if ( strncmp(buffer, 'cd ', 3) == 0 ) {
        // change directory
    }
    else if ( strcmp(buffer, 'quit') == 0 ) {
        terminate = true;
    }
    else {
        //run external command
    }

} while(!terminate);

return 0;

}

4

1 回答 1

8

您的比较字符串不正确。它们应该是形式"hist",而不是'hist'

在 C++ 中,'hist'只是一个字符文字(如 C++0x 草案 (n2914) 标准的第2.14.3节所述),我强调最后一段:

字符文字是用单引号括起来的一个或多个字符,如在 'x' 中,可选地前面有字母 u、U 或 L 之一,如在 u'y'、U'z' 或 L'x' , 分别。

不以 u、U 或 L 开头的字符文字是普通字符文字,也称为窄字符文字。

包含单个 c-char 的普通字符文字具有 char 类型,其值等于执行字符集中 c-char 编码的数值。

包含多个 c-char 的普通字符文字是多字符文字。多字符文字具有 int 类型和实现定义的值。

至于有没有更好的方法,这取决于你所说的更好:-)

一种可能性是建立一个函数表,它基本上是一个结构数组,每个结构都包含一个单词和一个函数指针。

然后,您只需从字符串中提取单词并在该数组中进行查找,如果找到匹配项则调用该函数。以下 C 程序显示了如何使用函数表。至于这是否是一个更好的解决方案,我会留给你(这是一种中等先进的技术)——你最好坚持你所理解的。

#include <stdio.h>

typedef struct {         // This type has the word and function pointer
    char *word;          // to call for that word. Major limitation is
    void (*fn)(void);    // that all functions must have the same
} tCmd;                  // signature.

// These are the utility functions and the function table itself.

void hello (void) { printf ("Hi there\n"); }
void goodbye (void) { printf ("Bye for now\n"); }

tCmd cmd[] = {{"hello",&hello},{"goodbye",&goodbye}};

// Demo program, showing how it's done.

int main (int argc, char *argv[]) {
    int i, j;

    // Process each argument.

    for (i = 1; i < argc; i++) {
        //Check against each word in function table.

        for (j = 0; j < sizeof(cmd)/sizeof(*cmd); j++) {
            // If found, execute function and break from inner loop.

            if (strcmp (argv[i],cmd[j].word) == 0) {
                (cmd[j].fn)();
                break;
            }
        }

        // Check to make sure we broke out of loop, otherwise not a avlid word.

        if (j == sizeof(cmd)/sizeof(*cmd)) {
            printf ("Bad word: '%s'\n", argv[i]);
        }
    }

    return 0;
}

运行时:

pax> ./qq.exe hello goodbye hello hello goodbye hello bork

你得到输出:

Hi there
Bye for now
Hi there
Hi there
Bye for now
Hi there
Bad word: 'bork'
于 2009-10-28T04:06:33.163 回答