2011-11-30 74 views
41

我有一个程序在这里我反转输入的字符串的情况。这是我的.cpp文件中的代码,我正在使用Visual Studio C++ IDE。我不确定在头文件中需要什么,或者如果我需要一个这样的工作。功能调用标识符未找到错误

我的函数调用swapCase出错。主要因为某些我不确定的原因而看不到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 
    } 
} 

赞赏语法或语义的任何其他技巧。

+1

对于用户输入使用固定大小的数组非常危险 - 如果输入40个字符,程序可能会崩溃或更糟。你应该将'name'设为'std :: string',并将其读作'getline(cin,name)'。 –

回答

62

main函数之前添加此行:

void swapCase (char* name); 

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

这就是所谓的向前声明:编译器需要知道函数原型在函数调用编译。

+9

或者直接在'main'之前移动'swapCase'的定义。 –

+1

ahhh,这个工程。自从使用C语言以来已经有一段时间了。 :D非常感谢。 – KRB

+0

当然,在main之前移动整个swapCase函数将会工作。 –

0

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

15

与其他语言不同,您可能会习惯使用C++中的所有内容,然后才能使用它。编译器会从上到下阅读你的源文件,所以当它到达swapCase的调用时,它不知道它是什么,所以你得到一个错误。你可以用这样一行提前申报主你的函数:

void swapCase(char *name); 

,或者你可以简单地提前主要移动该功能的全部的文件中。不要担心文件底部看起来最重要的功能(主要)。在C或C++中这是很常见的做法。

8

当编译器遇到main()中的swapCase调用时,它不知道函数swapCase,因此它报告错误。你可以移动定义的的swapCase上述主要或声明交换情况下上述主要:

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-tests的构造是一个个人风格的问题。你很好。最主要的是修改名称[i]的方式 - 使用'a'与'A'的区别使得它更加明显,没有人会怀疑'32'是否确实是正确的。

祝你好运学习!