Идентификатор не найден ошибкой при вызове функции
У меня есть программа здесь, где я инвертирую случай введенной строки. Это код в моем .cpp файле, и я использую Visual Studio С++ IDE. Я не уверен, что мне нужно в файле заголовка, или если мне это нужно, чтобы сделать эту работу.
Ошибка с моей функцией call 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
}
}
Приветствуются любые другие советы по синтаксису или семантике.
Ответы
Ответ 1
Добавьте эту строку перед основной функцией:
void swapCase (char* name);
int main()
{
...
swapCase(name); // swapCase prototype should be known at this point
...
}
Это называется форвардным объявлением: компилятор должен знать прототип функции при компиляции вызова функции.
Ответ 2
В отличие от других языков, к которым вы можете привыкнуть, все, что должно быть в С++, должно быть объявлено до его использования. Компилятор будет читать ваш исходный файл сверху вниз, поэтому, когда он доходит до вызова swapCase
, он не знает, что это такое, поэтому вы получаете сообщение об ошибке. Вы можете объявить свою функцию впереди main с помощью строки, подобной этой:
void swapCase(char *name);
или вы можете просто переместить всю эту функцию перед основным файлом. Не беспокойтесь о том, что в нижней части файла есть, по-видимому, самая важная функция (основная). Это очень распространено в C или С++ для этого.
Ответ 3
В то время, когда компилятор встречает вызов 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] - использование разницы в "a" и "A" делает более очевидным то, что происходит, и никто не должен задаться вопросом, действительно ли "32". /p >
Успешное обучение!
Ответ 4
Вы должны определить void swapCase перед основным определением.