Во-первых, если вы собираетесь изучать C ++, вы должны научиться писать программы на C ++, а не программы на C.Вот ваша программа на идиоматическом C ++:
#include <iostream>
#include <string>
int main(int, char **) {
std::string name;
std::cout << "Enter string: " << std::flush;
std::cin >> name;
std::cout << name << "\n";
}
Одно из преимуществ использования C ++ и его стандартных библиотек над C и его стандартными библиотеками заключается именно в следующем: вам почти никогда не нужно использовать указатели.
Но, принимая вашу программу за то, что она того стоит, есть несколько проблем.Во-первых, в C ++, если вы хотите получить доступ к заголовочным файлам C, вы должны включить их с именами C ++:
#include <cstdio>
#include <cstdlib>
Далее, main
требует правильной подписи:
int main(int, char**) {
Самое главное, вы не выделяете достаточно места для имени вашего пользователя:
name = (char *)malloc(A_BIG_ENOUGH_NUMBER);
Здесь вы должны выделить достаточно места, чтобы scanf()
не записывал после конца вашего буфера.Но вы не можете знать, насколько он велик, пока не закончится scanf
.Этот catch-22 является источником ошибок "переполнения буфера".Для вашей тестовой программы, так как вы управляете вводом, вероятно, можно просто выбрать число больше, чем любое имя, которое вы когда-либо будете вводить.В производственном коде вы НИКОГДА, НИКОГДА не должны использовать scanf
таким образом.
name = (char *)mallocc(40);
Кстати, если вы компилируете это как код на C, вы никогда не должны приводить результат от malloc
,Если вы компилируете это как код C ++, вы должны всегда приводить результат из malloc
.
printf("%c", *name); name++
В этой строке отсутствует точка с запятой.Вы скомпилировали эту программу?В будущем, пожалуйста, отправляйте только тот код, который вы скомпилировали.Пожалуйста, используйте функции вырезания и вставки вашего компьютера, чтобы публиковать код, никогда не вводите код вручную.
В этой строке есть две другие проблемы.Во-первых, вы должны отменить защиту указателя name
, чтобы получить доступ к данным, на которые он указывает.(Итак, *name
вместо name
.) Во-вторых, вам не нужно разыменовывать имя во втором операторе в этой строке, поскольку вы ничего не делаете с результирующими указанными данными.(Итак, name++
вместо *name++
.)
Наконец, что самое важное, покупайте, читайте и учитесь на хорошей книге .