【问题标题】:Identifier not found error on function call函数调用时未找到标识符错误
【发布时间】:2012-01-09 21:00:33
【问题描述】:

我有一个程序在这里我反转输入字符串的大小写。这是我的 .cpp 文件中的代码,我正在使用 Visual Studio C++ IDE。我不确定我在头文件中需要什么,或者我是否需要一个来完成这项工作。

我的函数调用 swapCase 出错。由于某种我不确定的原因,Main 没有看到 swapCase。

#include <cctype>
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    char name[30];
    cout<<"Enter a name: ";
    cin.getline(name, 30);
    swapCase(name);
    cout<<"Changed case is: "<< name <<endl;
    _getch();
    return 0;
}

void swapCase (char* name)
{
    for(int i=0;name[i];i++)
    {
        if ( name[i] >= 'A' && name[i] <= 'Z' )
            name[i] += 32; //changing upper to lower
        else if( name[i] >= 'a' && name[i] <= 'z')
            name[i] -= 32; //changing lower to upper
    }
}

感谢任何其他语法或语义提示。

【问题讨论】:

  • 使用固定大小的数组进行用户输入是非常危险的——如果我输入 40 个字符,那么程序可能会崩溃,或者更糟。您应该将name 设为std::string,并将其读作getline(cin, name)

标签: c++ compiler-errors


【解决方案1】:

在 main 函数之前添加这一行:

void swapCase (char* name);

int main()
{
   ...
   swapCase(name);    // swapCase prototype should be known at this point
   ...
}

这称为前向声明:编译函数调用时,编译器需要知道函数原型。

【讨论】:

  • 或者简单地将swapCase的定义移到main之前。
  • 所以被调用者必须在调用者之上?这真可笑!这对编译器开发人员来说是那么古老和懒惰。
【解决方案2】:

与您可能习惯的其他语言不同,C++ 中的所有内容都必须先声明才能使用。编译器会从上到下读取你的源文件,所以当它调用swapCase时,它不知道它是什么,所以你会得到一个错误。你可以在 main 之前声明你的函数,如下所示:

void swapCase(char *name);

或者您可以简单地将整个函数移到文件中的 main 之前。不要担心文件底部有看似最重要的函数(main)。在 C 或 C++ 中这样做很常见。

【讨论】:

    【解决方案3】:

    编译器在main()中遇到swapCase调用的时候,并不知道swapCase函数,所以报错。你可以将swapCase的定义移到main之上,或者declareswap case在main之上:

    void swapCase(char* name);
    

    此外,swapCase 中的 32 会让读者停下来想知道。评论有帮助!在这种情况下,它会增加写作的清晰度

    if ('A' <= name[i] && name[i] <= 'Z')
        name[i] += 'a' - 'A';
    else if ('a' <= name[i] && name[i] <= 'z')
        name[i] += 'A' - 'a';
    

    我的 if 测试中的构造是个人风格的问题。你的很好。主要是修改 name[i] 的方式——使用 'a' 与 'A' 的差异可以更清楚地了解发生了什么,没有人需要怀疑 '32' 是否真的正确。

    祝你学习顺利!

    【讨论】:

      【解决方案4】:

      您必须在主定义之前定义 void swapCase。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-06
        • 1970-01-01
        • 2013-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多