LINUX.ORG.RU

Помогите доработать лабу


0

0

Суть: Клиент-сервер калькулятор в восьмеричном виде. Значения в качестве параметров перед запуском клиента указывается, передается на сервер там вычисляется и взад выдает ответ. Нужно ввести ограничения на цифры и числа которых нет в восьмеричной системе, чтобы выдавалась ошибка.

Код клиента: #include <rpc/rpc.h> #include <stdio.h> #include <stdlib.h> #include "common.h" #include <rpcsvc/rusers.h>

main (argc, argv) int argc; char **argv; { char *arg; int answer; int stat; int one,two; if (argc < 3){ printf("Use ./c 3 + 6\n"); exit (1); } one=atoi(argv[2]); two=atoi(argv[4]); arg=(char*)malloc(30); sprintf(arg,"%s:%s|%s",argv[2],argv[3],argv[4]); //printf("%s\n",arg); if (stat = callrpc (argv[1], MY_PROG, MY_VER, MY_PROC1,(xdrproc_t)xdr_wrapstring,(char *)&arg,(xdrproc_t)xdr_int ,(char *)&answer) != 0) { clnt_perrno (stat); exit (2); }; // stat=atoi(answer); printf ("%d%s%d=%o\n",one,argv[3],two, answer); exit (0); }

Код сервера: #include <rpc/rpc.h> #include <stdio.h> #include "common.h" #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <dirent.h>

int *proc1 ();

int pow(int src,int p){ int i,rez=1; for(i=0;i<p;i++){ rez=rez*src; } return rez; }

int octtodec(int src){ int st=0,rez=0,i;

while(src!=0){ i=src%10; src=src/10; rez=rez+i*pow(8,st); st++; } return rez; }

main () { registerrpc (MY_PROG, MY_VER, MY_PROC1, proc1, xdr_wrapstring, xdr_int); svc_run(); fprintf (stderr, "Error: svc_run returned\n"); exit (1); }

int *proc1 (indata_p) char **indata_p; { static int res; static char odd[] = {"odd"}; char *s; int n,i; char otvet[100]; char one[10]="\0\0\0\0\0\0\0\0\0\0"; char two[10]="\0\0\0\0\0\0\0\0\0\0"; char z[3]="\0\0\0"; s=(*indata_p); // Выделяем первый аргумент n=strcspn(s,":"); strncpy(one,s,n); printf("->> %s\n",one); s = strpbrk(s,":"); // --- // Выделяем знак выражения z[0]=s[1]; printf("znak = %s\n",z); // --- // Выделяем вторый аргумент s=strpbrk(s,"|"); printf("strlen = %i n =%i str =%s\n",strlen(s),n,s); for(i=1;i<strlen(s);i++){ two[i-1]=s[i]; } printf("->> %s\n",two); // ---

n=atoi(one); i=atoi(two);

n=octtodec(n); i=octtodec(i);

if (strcmp(z,"+")==0){n=n+i;} if (strcmp(z,"-")==0){n=n-i;} if (strcmp(z,"*")==0){n=n*i;} if (strcmp(z,"/")==0){n=n/n;}

printf ("Result: %i\n", n); res=n; return &res; }

anonymous

Судя по форматированию, это С-шный ответ легендарному перловскому одностроку, стирающему все с /

Sidrian
()

О, ниразу не видел, чтобы сейчас кто-то так объявлял функции. Я про
>main (argc, argv)
>int argc; char **argv;

Laz ★★★★★
()

>printf("Use ./c 3 + 6\n")

Жгёте. Если программу можно запускать только так, зачем столько кода? :)

Я не понял, где вы хотите вводить ограничения на допустимые значения входных символов --- в клиенте или сервере... Рекомендую принять man strtol, у этой функции есть параметр base и она определяет лишнии символы.

В целом код убойный:
>arg=(char*)malloc(30); sprintf(arg, ...
Зачем безусловный malloc на фиксированный размер блока памяти, да еще sprintf() с неизвестный размером argv[3], хотя есть snprintf(), рекомендованный к использованию.

>n=atoi(one); i=atoi(two);
>n=octtodec(n); i=octtodec(i);
Порвало на части. Перевести строку в число как содержащую десятичное число, чтобы потом это число поразрядно с помощью (i=src%10; src=src/10) переводить в восьмиричное.

> if (strcmp(z,"+")==0){n=n+i;} if (strcmp(z,"-")==0){n=n-i;} if (strcmp(z,"*")==0){n=n*i;} if (strcmp(z,"/")==0){n=n/n;}
Откройте для себя оператор case. Все равно знак у вас char:
>Выделяем знак выражения z[0]=s[1]



mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.