2013-06-01 4 views
1

O имеет назначение, в котором я должен создать функцию, чтобы пригласить пользователя для имени файла и передать вход обратно в main. Я должен передать его в качестве параметра (я предполагаю, что это означает, что это pass-by-reference.) Я просто работаю над первой функцией «getFileName». Я знаю, что в C++ есть более простые способы сделать это, но мне поручено это сделать, я уверен, что здесь есть что-то ценное, но я не понимаю. В любом случае я был в состоянии получить функцию для работы с целыми числами, как, например:Параметр, передаваемый с текстом в C++

#include <iostream> 
using namespace std;  

void getFileName(int &fileName); 

int main() 
{ 
    int fileName; 
    getFileName(fileName); 
    cout << fileName; 
    return 0; 
} 

void getFileName(int &fileName) 
{ 
    cout << "Please enter the filename: "; 
    cin >> fileName; 
    return; 
} 

Моя проблема arrises когда я пытаюсь изменить целые числа в текст. Я сказал, чтобы использовать прототип:

void getFileName(char []); 

Все Стараюсь дает мне ошибки, в основном делать с установкой указателей на массивы, или установить ссылку на массивы и так далее. Мой текущий код выглядит следующим образом:

#include <iostream> 
using namespace std; 

void getFileName(char &fileName[]); 

int main() 
{ 
    char fileName[]; 
    getFileName(fileName); 
    cout << fileName; 
    return 0; 
} 
void getFileName(char &fileName) 
{ 
    cout << "Please enter the filename: "; 
    cin >> fileName; 
    return; 
} 

И я получаю ошибки с г ++:

assign26.cpp:19: error: declaration of ‘fileName’ as array of references 
assign26.cpp: In function ‘int main()’: 
assign26.cpp:23: error: storage size of ‘fileName’ isn't known 

Отдавая мне код, чтобы решить эту проблему поможет мне получить мое назначение сделано, я хочу, чтобы понять, что происходит, поэтому, пожалуйста, объясните решения. Я очень ценю всю помощь.

EDIT

Вот код, который работает, спасибо членам этого сайта за помощь!

void getFileName(char fileName[]); 

int main() 
{ 
    char fileName[256]; 
    getFileName(fileName); 
    cout << fileName; 
    return 0; 
} 

void getFileName(char fileName[]) 
{ 
    cout << "Please enter the filename: "; 
    cin >> fileName; 
    return; 
} 

Проблема: я не понял, как работает массив. Я пытался передать текст по ссылке, когда мне это не нужно. Также синтаксические ошибки, которые я должен был увидеть.

+2

'char & fileName []' объявлен как массив ссылок на символ. В стандарте говорится, что не может быть массива ссылок. Но вам это не нужно, чтобы выполнить то, что вы делаете. – 0x499602D2

+0

«Размер хранилища« имя_файла »неизвестен» только потому, что вы не указываете размер здесь 'char fileName [];'. – mwerschy

+0

Подписи прототипа и реализации не совпадают. Это еще одна проблема. – 0x499602D2

ответ

0

Подпись прототипа вашей функции не соответствует подписи ее реализации. Вероятно, вы думаете, что char& x[] - это то же самое, что и char& x в списке параметров, но они на самом деле очень разные. Первый объявляет массив ссылок на символ, а последний объявляет ссылку на символ. Массив ссылок запрещен стандартом, поэтому это невозможно, и передача этой переменной по ссылке (которую я подозреваю, вы пытались сделать) в этой ситуации не требуется.

В своем посте вы сказали, что хотите вставить текст. Если это так, все, что вам нужно, это массив символов. Ваша подпись должна выглядеть примерно так:

void getFileName(char fileName[]); 

Кроме того, внутри магистральными вы объявляете массив fileName неизвестной границы. Это запрещено, так как вы должны указать размер.Что-то вроде:

char fileName[256]; 

Но если вы не знаете, сколько символов будет введено пользователем, вы должны динамически выделять массив. Например, используйте std::string:

#include <string> 

void getFileName(std::string &); 

int main() 
{ 
    std::string fileName; 
    getFileName(fileName); 
} 

void getFileName(std::string& fileName) 
{ 
    std::cout << "Please enter the filename: "; 
    std::cin >> fileName; 
} 
+0

Спасибо за разъяснение, я не знал, что просто создание массива будет иметь такой же эффект, как передача целого по ссылке. – ThomasNichols89

+0

@ user2443549 Вы не передаете целое число по ссылке. Это массив * 'char' *. – 0x499602D2

+0

@ user2443549 Вы что-то смущены? У вас возникли проблемы? – 0x499602D2

0

Вы не указали какую-либо память для имени файла. Таким образом, имя файла не будет помещаться в буфер (нулевая длина). Вам нужно что-то вроде

char fileName [256];

Кроме того, ваш прототип функции для getFileName не соответствует самой функции. Сделайте оба списка параметров одинаковыми.

Смежные вопросы