Вход:
delim: +
user name: jack
dir: /home/stud
paths: ~/games/packman.cpp+~alex/docs+~/study/Prog/lab4.c+/usr/bin/gcc
Выход:
new paths: /home/stud/games/packman.cpp+~alex/docs+~/study*/Prog/lab4.c +/usr/bin/gcc

~/games/packman.cpp подходит под требования перевода относительного пути к абсолютному.
~alex/docs не походит под требования перевода т.к после ‘~’ должен идти знак ‘/’.
~/study*/Prog/lab4.c не подходит под требования т.к в пути присутствует один из запрещенных символов ‘*’.
/usr/bin/gcc не подходит под требования перевода т.к первым символом должно быть ‘~’.
Листинг программы
#include<stdio.h>
void scanStroki(char mass[],int *l){
int i=0;
do{
scanf("%c",&mass[i]);i++;
}while(mass[i-1]!='\n');
mass[i-1]='\0';
*l=i-2;
}
void outStroki(char mass[]){
int i=0;
for(i=0;mass[i]!='\0';i++){
printf("%c",mass[i]);
}
}
int proverka(char mass[]){
int i;
for(i=0;mass[i]!='\0';i++){
if(mass[i]==0x22||mass[i]==0x2A||mass[i]==0x3A||mass[i]==0x3C||mass[i]==0x3E||mass[i]==0x3F||mass[i]==0x7C||mass[i]==0x5C){
return -1;
}
}
return 0;
}
int stok(char str[],char delim, char *ptr[]){
char *suf=str;
char *s;
ptr[0]=str;
int i,j=1;
for(i=0;suf[i]!='\0';i++){
if(suf[i]==delim){
suf[i]='\0';
s=suf+i+1;
ptr[j]=s;;
j++;
}
}
return j;
}
int MAX_PATH = 260;
int main(){
char paths[MAX_PATH];
int bool;
FILE *f = fopen("input","r");
if(f=='\0'){
printf("bad FILE");
}
else{
fgets(paths,MAX_PATH,f);
printf("input paths: %s",paths);
char delim = '+';
printf("delim: %c\n",delim);
char dir[260];
int ln,ld;
printf("input dir: ");
scanStroki(dir,&ld);
bool=proverka(dir);
if(bool==0){
char name[20];
printf("input name student: ");
scanStroki(name,&ln);
bool=proverka(name);
if(bool==0){
char *ptr[20];
int lenghtPtr,i,j;
lenghtPtr=stok(paths,delim,ptr);
int p[lenghtPtr+1];
for(i=0;i<lenghtPtr;i++){
p[i]=0;
}
for(i=0;i<lenghtPtr;i++){
for(j=0;*(ptr[i]+j)!='\0';j++){
if(*(ptr[i]+j)==0x22||*(ptr[i]+j)==0x2A||*(ptr[i]+j)==0x3A||*(ptr[i]+j)==0x3C||*(ptr[i]+j)==0x3E||*(ptr[i]+j)==0x3F||*(ptr[i]+j)==0x7C||*(ptr[i]+j)==0x5C){
p[i]=1;break;
}
}
}
printf("output paths: ");
for(i=0;i<lenghtPtr;i++){
if(i!=0){
printf("%c",delim);
}
if(p[i]!=1&&*(ptr[i])=='~'&&*(ptr[i]+1)=='/'){
if(dir[ld]!=0x2F){
printf("%s/",dir);
}
else{
printf("%s",dir);
}
if(name[ln]!=0x2F){
printf("%s/",name);
}
else{
printf("%s",name);
}
printf("%s",ptr[i]+2);}
else{
printf("%s",ptr[i]);
}
}
}
else{
printf("Bad name");
}
}
else{
printf("Bad dir");
}
}
return 0;
}