2015-05-28 5 views
0

Я очень новичок в C++. Я родом из земли java, поэтому система ввода/вывода меня немного сбивает с толку, поэтому извините, если это глупый вопрос.Нарушение прав доступа при попытке чтения и записи строки?

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

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    char* pizza = ""; 
    std::cin >> pizza; 
    std::cout << pizza; 


    return 0; 
} 

Я получаю исключение нарушения доступа, из-за чего я думаю, что у меня есть неверный адрес памяти где-то.

ответ

5

Я объясню, что не так с вашим кодом, но во-первых, правильный код.

#include <string> 
#include <iostream> 

int main() 
{ 
    std::string pizza; 
    std::cin >> pizza; 
    std::cout << pizza; 

    return 0; 
} 

Это использует стандартный класс библиотеки строк, вместо char*. Теперь о вашем коде.

char* pizza = ""; 

Это неправильно. Он компилируется в более старых стандартах, но даже тогда это была плохая идея. Строковые литералы, такие как "", являются массивами символов const. В приведенной выше строке вы назначаете неконстантный указатель на этот массив символов const. Во всех других контекстах, связанных с массивами и указателями, это незаконно, как и должно быть. Допустимо (до C++ 11) для строковых литералов по историческим причинам, но вы все равно не должны этого делать. Потому что даже если у вас есть неконстантный указатель, он по-прежнему запрещено писать на место он указует, что именно поэтому вы получаете нарушение прав доступа при попытке сделать это:

std::cin >> pizza; 
+0

Почему я не могу использовать char *? – grey00

+0

@ user3238865: Вы можете, вы просто должны знать, как правильно использовать его. т. е. вам необходимо правильно распределить память и указать символ «char *» в эту память. И вам нужно быть осторожным, чтобы не переполнять память, которую вы выделили, и целый ряд других проблем. Но, помимо опыта программирования на языке, вы теряете время, потому что все эти проблемы уже решены, а решения инкапсулированы в класс 'std :: string', который был широко протестирован. –

1

Вам необходимо указать массив. Как:

char pizza[50]; 

Это будет работать, однако этот код может быть писать мимо границ массива (и для стандарта С ++ это просто неопределенное поведение). Как отмечали другие плакаты, использование std::string было бы более разумным и простым в использовании.

Вы можете проверить учебник this для быстрого ввода базового ввода/вывода C++.

+0

Спасибо, это работает! Я подозревал, что это проблема, и попытался сделать что-то вроде 'char * pizza =" aaaaaaaaaaaaaaaa ", но это не сработало. Есть ли какая-то причина, по которой вы должны дать это пространство таким образом? – grey00

+0

@ user3238865 Основная проблема заключается в том, что вы приходят с Земли Java, где вы не управляете памятью. Для быстрого ввода в C++ вы можете сначала прочитать [Java To C++ Tutorial] (https://cs.brown.edu/courses/csci1230/docs/java_to_cpp.shtml) – JosEduSol

+1

Нет, основная проблема заключается в том, что он изучает C++ из страшный источник. С правильным C++ вам также не нужно управлять памятью. Ручное управление памятью на C++ - это право, а не мандат. –

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