Динамическое выделение памяти в си
Автор Supra7sky задал вопрос в разделе Другие языки и технологии
Динамическое выделение памяти, при сравнении строк. (Си без использования встр. функций) и получил лучший ответ
Ответ от Ra[гуру]
> char *pass;
> scanf("%s", &pass);
Это не будет работать!
В переменной pass мусор при создании, иначе говоря она содержит адрес какого-угодно места в памяти. Спецификатор %s требует просто адрес, а не адрес указателя, как у тебя.
Лучше не выеживаться, а таки ограничить длину пароля:
char pass[33];
scanf("%""32s", pass);
> Си без использования встр. функций
В Си нет встроенных функций. Все функции библиотечные, либо из стандартной библиотеки языка Си, либо из сторонних. В Си нет операторов выделения/освобождения динамической памяти, для этого есть библиотечные функции malloc, realloc, calloc, free.
Примитивная реализация чтения слова со стандартного ввода, используя динамическое выделение памяти:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
char *getword() {
size_t n = 1;
int c;
char *s = (char *)malloc(1);
s[0] = ' ';
while ( !isspace(c = getchar()) ) {
char *t = (char *)realloc(s, n + 1);
if (t == NULL) {
free(s);
return NULL;
}
s = t;
s[n - 1] = c;
s[n++] = ' ';
}
fflush(stdin);
return s;
}
main() {
char *s;
printf("word? ");
s = getword();
printf("'%s'
", s);
free(s);
}
Память выделенную под строки полученные getword надо освобождать функцией free.
Сама функция плохая: обычно память выделяют и перераспределяют порциями определенного размера, а не по одному символу, как сделано здесь.
Считываеш пароль с закрывающим нулем в буфер. Перед проверкой еще посчитай количество символов. Зачем динамически выделать память непонятно.
**string это указатель на указатель, или массив массивов, или двухмерный массив.
Кто дает такие идиотские задания -- "без использования встр. функций"???
Учат изобретать велосипед?
Идиоты.. .
Как ты будешь динамически выделять память без использования встроенных функций?
Ухитриться можно, но это же бред собачий...
Пароли где-то хранятся, например в базе данных. Если он у вас не ограничен по размеру, то найдутся шутники, которые возьмут нетленный труд Карла Маркса в подлиннике, перемешают, в случайном порядке, с полным собранием сочинений Джоан Роулинг, удалят пробельные символы и символы конца строк, затем используют в качестве пароля. 100000 таких паролей и у вас самая большая в мире база данных!
Сравнивайте со своим замыслом.
#include <stdio.h>
#include <locale.h>
enum msg { PASSWORD, ACKKNOWLEDGEMENT, ERROR, GOOD };
#define BUF 256
void ui(short);
int compare(char *, char *); // функция сраниивает две строки на эквивалентность
int main() {
char password[BUF], acknowledgement[BUF];
ui(PASSWORD);
scanf_s("%s", password);
ui(ACKKNOWLEDGEMENT);
scanf_s("%s", acknowledgement);
while (!compare(password, acknowledgement)) {
ui(ERROR);
scanf_s("%s", acknowledgement);
}
ui(GOOD);
getchar(); getchar();
return 0;
}
int compare(char * _pass, char * _ackn) { // если эквиваленты, возвращает длины, нет - ноль
int result = 0, p, a;
if (_pass && _ackn) {
p = 0, a = 0;
while (_pass[p++] != 0);
while (_ackn[a++] != 0);
if (p == a) {
result = p - 1;
p = 0, a = 0;
while (_pass[p] == _ackn[a] && _ackn[a]) { p++; a++; };
if (p < result) result = 0;
}
}
return result;
}
void ui(short _msg) {
setlocale(LC_CTYPE, "Russian_Russia.1251");
switch (_msg) {
case PASSWORD: printf(" Введите пароль: "); break;
case ACKKNOWLEDGEMENT: printf(" Подтвердите пароль: "); break;
case ERROR: printf("a Вы ошиблись! Повторите ввод: "); break;
case GOOD: printf(" Успешно! "); break;
}
setlocale(LC_CTYPE, "English_United States.866");
}
Как динамически выделить память под структуру? (Си)
Так динамически или статически ?
статически :
Book mybookarray[3];
подробнее...
Динамический массив в Си
Операция new для языка C++, а в Си требуется такая конструкция при выделении памяти:
подробнее...
Си realloc
А чем тебе описания в сети не по-человечески? Судя по коду, тебе еще рано за управление памятью
подробнее...
Оператор return в СИ
Оператор return возвращает то, что ты укажешь ему.
Оперируют в большинстве только со
подробнее...