2011-11-30 77 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'是否確實是正確的。

祝你好運學習!