Подскажите пожалуйста в чём ошибка? Проблема в том, что я не могу никак понять как работают функции, в смысле как их записывать. Данная часть кода работает, но непонятно как его преобразовать в функции. В данном коде нужно использовать 2 функции: ввода строки и подсчёта различных элементов в этой строке. вот Код без функций и он исправно работает.
#include "pch.h"
#include
#include
int main()
{
char*array = NULL;
int schetch = 0;
int i = 0, j = 0, k = 0;
do
{
array = (char*)realloc(array, (i + 1) * sizeof(char));
array[i] = getchar();
i++;
k++;
} while (array[i - 1] != '\n');
for (i = 0; i < k; i++)//
{
printf("%c", array[i]);
if (i != 0) {
for (j = 0; j < i; j++)
{
printf("\n%с", array[i]);
if (array[i] == array[j])
{
break;
}
if (j == i - 1)schetch++;
}
}
else
{
schetch++;
}
}
schetch--;//
array[i] = '\0';
return 0;
}
------------------------------------------------------------------------------------------------------------------
А вот код с функциями и о не работает.
#include "stdafx.h"
#include
char* vvod_strok_razd(char *);
int podschet(int, int, int );
char *str_razd;
int schetch, i, j, k;
int main()
{
/*char *str_razd;
int schetch;*/
vvod_strok_razd(str_razd);
podschet(schetch, i, j);
return 0;
}
char* vvod_strok_razd(int i, int k)
{
str_razd = NULL;
str_razd = (char*)malloc(sizeof(char));
i = 0;
do
{
str_razd = (char*)realloc(str_razd, (i + 1) * sizeof(char));
str_razd[i] = getchar();
i++;
k++;
} while (str_razd[i] != '\n');
str_razd[i] = '\0';
return str_razd;
}
int podschet(int j, int i, int k)
{
str_razd = 0, i = 0, j = 0;
schetch = 0;
for (i = 0; i < k; i++)
{
printf("%c", str_razd[i]);
if (i != 0) {
for (j = 0; j < i; j++)
{
printf("\n%с", str_razd[i]);
if (str_razd[i] == str_razd[j])
{
break;
}
if (j == i - 1)schetch++;
}
}
else
{
schetch++;
}
schetch--;
}
return schetch;
}
Другие языки программирования и технологии
Функции в языке программирования C.
Не могу понять, где во втором варианте вообще описана/вызвана функция.
Синтаксис функции:
<тип> <имя функции>(<аргументы>)
{
//тело функции
}
Пример:
int MIN(int a, int b)
{
return a<b? a:b;
}
Функции описываются вне мейна (перед ним, или после него, но во втором случае необходимо описать прототипы.
Пример вызова вышеуказанной функции в мейне:
int a = 5, b = 10;
printf("%d", MIN(a,b));
Минимум есть, дальше гугл и книги тебе в помощь.
Синтаксис функции:
<тип> <имя функции>(<аргументы>)
{
//тело функции
}
Пример:
int MIN(int a, int b)
{
return a<b? a:b;
}
Функции описываются вне мейна (перед ним, или после него, но во втором случае необходимо описать прототипы.
Пример вызова вышеуказанной функции в мейне:
int a = 5, b = 10;
printf("%d", MIN(a,b));
Минимум есть, дальше гугл и книги тебе в помощь.
Димар" И К
Оригинал тоже не работает
Димар" И К
free (array); ОТСУТСТВУЕТ СОВСЕМ. А потом гаджеты орут ПАМЯТИ НЕ ХВАТАЕТ
Иван Алексеев
А какие переменные должны находиться в аргументах?
Мне вообще решение с realloc не нравится, в т. ч. использование getchar и посимвольный ввод.
Т. к. символов в строке в однобайтовой кодировке может быть всего 255 (и 0 терминатор) - не проще ли взять массив на 255 символов и помечать в массиве с соотв. индексом, если этот символ уже встретился.
Предлагаю как-то так:
#include < stdio.h >
#include < string.h >
#include < limits.h >
size_t getString(const char* prompt, char* buf, const size_t size) {
printf("%s", prompt);
if (fgets(buf, size, stdin)) {
size_t l = strlen(buf) - 1; buf[l]='\0';
return l;
}
return 0;
}
size_t getDiffCount(const char* buf, const size_t size) {
char map[UCHAR_MAX] = {0}; size_t count = 0;
for(size_t i=0; i < size; i++) {
size_t mapIndex = (unsigned char)buf[i];
if(!map[mapIndex]) {
count++;
map[mapIndex] = 1;
}
}
return count;
}
int main(int argc, char** argv) {
char buf[255];
printf("%lu", getDiffCount(buf, getString("string:", buf, sizeof(buf)/sizeof(*buf))));
}

Т. к. символов в строке в однобайтовой кодировке может быть всего 255 (и 0 терминатор) - не проще ли взять массив на 255 символов и помечать в массиве с соотв. индексом, если этот символ уже встретился.
Предлагаю как-то так:
#include < stdio.h >
#include < string.h >
#include < limits.h >
size_t getString(const char* prompt, char* buf, const size_t size) {
printf("%s", prompt);
if (fgets(buf, size, stdin)) {
size_t l = strlen(buf) - 1; buf[l]='\0';
return l;
}
return 0;
}
size_t getDiffCount(const char* buf, const size_t size) {
char map[UCHAR_MAX] = {0}; size_t count = 0;
for(size_t i=0; i < size; i++) {
size_t mapIndex = (unsigned char)buf[i];
if(!map[mapIndex]) {
count++;
map[mapIndex] = 1;
}
}
return count;
}
int main(int argc, char** argv) {
char buf[255];
printf("%lu", getDiffCount(buf, getString("string:", buf, sizeof(buf)/sizeof(*buf))));
}

... .
Если компилятор позволяет C99 стандарт - лучше использовать stdbool
Соотв. добавить и изменить...
#include < stdbool.h >
....
bool map[UCHAR_MAX] = {false};
...
map[mapIndex] = true;
Соотв. добавить и изменить...
#include < stdbool.h >
....
bool map[UCHAR_MAX] = {false};
...
map[mapIndex] = true;
Иван Алексеев
передо мной поставили задачу с динамическим выделение памяти. А функция getchar позволяет вводить не посимвольно.
Оригинал тоже не работает
Димар" И К
Запусти и посмотри ЧТО и КАК выводит... Ничего не смущает?
Иван Алексеев
Если бы я понимал как это сделать. Я бы не обращался за помощью. Я просто уже не знаю где взять литературу.
Похожие вопросы
- Стоит ли изучать язык программирования C++ ?И какое преимущество этого языка? Где он мне пригодится ?
- Основные различия языка программирования C# от С++.
- Вопрос по языку программирования C# (СиШарп) (очень простой вопрос)
- Я учусь в 5 классе и хочу научится языку программирования C++.
- Язык программирования C.
- Язык программирования C#
- Сложно ли будет изучить язык программирования C#?
- Почему язык программирования C++ считается одним из самых сложных языков программирования?
- Умрёт ли язык программирования C++?
- Оконное приложение на WinAPI, вопрос про параметры функции WndProc. Язык программирования Си.