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

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

Вот программа из которой нужно сделать функцию:
#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>
void fun(int n,int S,int k,int t, char *s)
{
s=(char*)malloc(n);
gets(s);
for(t=-1,k=S=0;s[ S ];k+=!!(32-s[S++]))
if(t < 0) if(32-s[ S ]) t=S;
return;
}
void main ()
{
int n,S,k,t;char *s;
printf("Enter maximum size for buffer enter: ");
scanf("%i",&n);
printf("Enter string: ");
scanf("%d",&s);
printf("first simbol not probel: fun=%c\n",s[t]);
printf("kollichestvo simvolov otlicha ot probela: fun=%d\n",k);
free(s);
}
Учите теорию, вы, функцию забыли вызвать! У вас t и k не инициализированы! s имеет тип указателя на char, а в scanf(), вы ему пытаетесь по его адресу целое число записать!

// Три этапа использования функций: объяление; определение; вызов.

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

// Объявление функции, её прототип.
// В прототипе задаётся имя функции, типы и число параметров, тип возвращаемого значения.
// В программе распологается выше места вызова функции или в заголовочном файле.
void func(int, int);

void main()
{
int x = 5, y = 8;

// Вызов функции.
// Приводит к выполнению действий перечисленных в определении функции.
// Завершает выполнение функции.
// Заменяет формальные параметры на фактические.
func(x, y);

getch();
}
// Определение функции.
// Состоит из двух частей: заголовка и тела, которое ограничено фигурными скобками.
// В определении функции её аргументы её аргументы - формальные параметры.
// Если функция объявлена выше вызова, то определена может быть ниже вызова.
void func(int a, int b)
{
printf("\n %d + %d = %d", a, b, a + b);
}
Вячеслав Кудрявцев
Вячеслав Кудрявцев
65 795
Лучший ответ
область видимости: t в майне и функции это _разные_ переменные

в майне не вызывается фун (то что внутри формата принта - просто часть формата)

в майне t не инциализировано и, раз нет вызова fun, то и память под s не выделена
так что s[ t] пытается брать непонятно откуда (и скорей всего грохнется на доступе к запрещенному)

malloc логичнее оставить в майне - по максимуму стоит выдерживать "кто выделяет память тот её и освобождает"

Грубо в простейшем варианте надо:
fun(...){...}
main(){
...
fun(...); /*или x=fun(...) от фунции и от ситуации*/
...
}
PG
Piotr Gerashenko
75 320
К сожалению у Вас нет вообще понимания программирования. Вы хотите main() функцию подтянуть функцию. почитайте теорию, а некоторые товарищи в этом форуме правильно сказали, освойте азы ассемблера. профессиональные программисты, фактически все это прошли.