Другие языки программирования и технологии

Помогите оформить функцию в Си

Есть программа которую нужно описать функцией, у меня вышло описать но оно срывается(краш программы) на выводе ответа. Использовал подсказки других пользователей, все равно краш программы не исчез.
Вот сама программа(чтоб никто ничего не писал она ПОЛНОСТЬЮ РАБОЧАЯ!):
#include <stdio.h>
#include <stdlib.h>
void main()
{
int n,S,k,t;
char *s;
printf("Введите максимальный размер для буфера ввода: ");
scanf("%i",&n);
s=(char*)malloc(n);
printf("Введите строку: ");
scanf("%d",&s);
gets(s);
for(t=-1,k=S=0;s[ S ];k+=!!(32-s[S++]))
if(t < 0) if(32-s[ S ]) t=S;
printf("первый символ отличающийся от пробела: %c\n",s[t]);
printf("количество символов отличающихся от пробела: %d\n",k);
free(s);
return;
}

А вот то что у меня вышло при описании программы функцией:

#include <stdio.h>
#include <stdlib.h>
fun (int n,int S,int k,int t,char *s)
{
s=(char*)malloc(n);
for(t=-1,k=S=0;s[ S ];k+=!!(32-s[S++]))
if(t < 0) if(32-s[ S ]) t=S;
free(s);
return;
}
void main()
{
int n,S,k,t; char *s;
printf("Введите максимальный размер для буфера ввода: ");
scanf("%i",&n);
printf("Введите строку: ");
scanf("%d",&s);
gets(s);
fun (n,S,k,t,*s);
printf("первый символ отличающийся от пробела: fun=%c\n",fun(n,S,k,t,*s),s[t]);
printf("количество символов отличающихся от пробела: fun=%d\n",fun(n,S,k,t,*s),k);
}
Помогите исправить пожалуйста.
Ну, и что там у вас работало? Функции scanf() и puts() между собой конфликтуют, и их использование в одном коде не рекомендуется. Можно, однако, выполнять очистку потока от содержащихся в нём символов, используя функцию fflush() с параметром stdin.

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <locale.h>

#define RU setlocale(LC_CTYPE, "Russian_Russia.1251");
#define EN setlocale(LC_CTYPE, "English_United States.866");

void func(char * s);

void main()
{
RU
int n;
printf("\n Введите максимальный размер для буфера ввода: ");
scanf("%d", &n);
fflush(stdin);
char * s = (char *) malloc(n * sizeof(char));

printf("\n Введите строку: ");
gets(s);

func(s);
free(s);

getch();
}

void func(char * s)
{
int m = -1, sum = 0, f = 1;

for (int n = 0; s[n] != '\0'; n++)
{
if (s[n] != ' ' && f)
{
printf("\n Первый символ отличающийся от пробела: ");
EN printf("%c\n", s[n]); RU
f = 0;
}
if (s[n] != ' ') sum++;
}
if (sum > 0) printf("\n Количество символов отличающихся от пробела: %d", sum);
else printf("\n Строка не содержит искомых символов! \a");
return;
}

P.S. Реализация поддержки русского языка выполнена для IDE Visual C++ 2010 и может быть изменена на ваше усмотрение.
Владимир Мартынов
Владимир Мартынов
96 586
Лучший ответ
Погоди чуть чуть. Я тебе по мылу скину мой вариант :)
Radik Galimov
Radik Galimov
30 330
Странность, однако. Вы определили s, как указатель (массив, условно) , а функции fun передаёте первый элемент массива, а не указатель на него (* в вызове зачем?) .
Дальше: где тип возвращаемого значения fun? Если его нет, пишите void (как у мэйна) .
Ещё дальше: аллочить память на строку надо в мэйне, один раз, и освобождать ровно там же. А то функция обрабатывает "неведомо что" на каждом вызове - создаёт какую-то свою память, что-то там делает, потом зачищает и ничего не возвращает.
printf в аргументах надо указать сначала форматную строку, а потом, собственно, что должно быть на каждом месте %...,по порядку. Уберите оттуда вызов fun к чертям, в форматной строке нет под него места, а вызов уже выполнен ранее, зачем делать это ещё раз?
Далее - функция не может повлиять на значение переменной, если не знает, где она находится. Чтобы знать это - ей нужен указатель, а передаётся ей в вашей реализации только значение.
Судя по тому, что я тут вижу, вам надо сделать ДВЕ функции. У вас же два разных результата, и получаете их вы по-разному. Соответственно, они должны возвращать char и int, а принимать только указатель на char (введённую строку) и длину (n).

В общем.. . Ваша программа вообще работать не должна, вы просто не понимаете, что она делает. И об указателях знаете, похоже, только понаслышке - вам не мешало бы серьёзнее поизучать этот вопрос, мощная вещь. Рекомендую книжку Подбельского и Фомина "Программирование на языке Си". Потратьте время, не пожалеете. Я до сих пор (первый курс университета) C++ изучать не начал, т. к. проникся указателями и структурами :)
Юрa Исабаев
Юрa Исабаев
1 234