Ошибка идентификации идентификатора при вызове функции - PullRequest
47 голосов
/ 30 ноября 2011

У меня есть программа, в которой я инвертирую регистр введенной строки. Это код в моем файле .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
    }
}

Любые другие советы по синтаксису или семантике приветствуются.

Ответы [ 4 ]

77 голосов
/ 30 ноября 2011

Добавьте эту строку перед основной функцией:

void swapCase (char* name);

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

Это называется предварительным объявлением: компилятору необходимо знать прототип функции при компиляции вызова функции.

16 голосов
/ 30 ноября 2011

В отличие от других языков, к которым вы можете привыкнуть, все в C ++ должно быть объявлено, прежде чем его можно будет использовать.Компилятор прочитает ваш исходный файл сверху вниз, поэтому, когда он доходит до вызова swapCase, он не знает, что это, поэтому вы получаете ошибку.Вы можете объявить свою функцию перед main с помощью строки, подобной этой:

void swapCase(char *name);

, или вы можете просто переместить всю эту функцию впереди main в файле.Не беспокойтесь о том, что, казалось бы, самая важная функция (главная) внизу файла.Это очень часто встречается в C или C ++.

8 голосов
/ 30 ноября 2011

В то время как компилятор встречает вызов swapCase в main (), он не знает о функции swapCase, поэтому он сообщает об ошибке.Вы можете либо переместить определение swapCase выше основного, либо объявить регистр подстановки выше основного:

void swapCase(char* name);

Кроме того, 32 в swapCase вызывает остановку чтенияи удивляться.Комментарий помогает!В этом контексте было бы яснее написать

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

Конструкция в моих if-тестах - вопрос личного стиля.Твои были просто в порядке.Главное - это способ изменить имя [i] - использование различия между «а» и «А» делает более очевидным, что происходит, и никто не должен задаться вопросом, является ли «32» на самом деле правильным *.1011 *

Удачи в обучении!

0 голосов
/ 30 ноября 2011

Вы должны определить void swapCase перед основным определением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...