Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: hỏi về cách sử lý parameters trong C

  1. #1
    Ngày gia nhập
    11 2007
    Nơi ở
    Hà Nội
    Bài viết
    520

    Mặc định hỏi về cách sử lý parameters trong C

    em có 1 chương trình cần thao tác như sau :
    khi chạy chuơng trình trên chế độ command thì theo cấu trúc
    Code:
    c:\ >lrc2srt [tên file nguồn] [tên file đích] [option1] [option2] [option3]
    em muốn xử lý sao cho khi argc >=4 ứng với lúc có các option thì chương trình không cần phân biệt vị trí các option vẫn cho ra kết quả( giống như lệnh copy của dos ấy)
    ví dụ ta đánh các lệnh sau thì cho cùng 1 kết quả
    Code:
    c:\ >lrc2srt [tên file nguồn] [tên file đích] [option1] [option2] [option3]
    c:\ >lrc2srt [tên file nguồn] [tên file đích] [option2] [option1] [option3]
    c:\ >lrc2srt [tên file nguồn] [tên file đích] [option3] [option2] [option1]
    nghĩa là các option có thể đổi chỗ cho nhau

    trong đó option 1 là /t hoặc /T đều được
    trong đó option 2 là /y hoặc /Y
    trong đó option 3 là /a hoặc /A

    em đã nghĩ đến sử dụng 1 mảng chỉ số
    C Code:
    1. int main(int argc,chả *argv[])              // khai báo hàm main
    2. {
    3.     int index[10],i;
    4.    
    5.     for (i=0;i<10;++i)
    6.         index[i]=0;    // khởi tạo tất cả có giá trị 0
    7.     if(argc>=4)
    8.         for(i=3;i<argc;++i)
    9.         {
    10.          if((strstr(argv[i],"/t"))!=NULL)  // nếu gặp option1 /t thì index[1] ứng
    11.              index[1]=i;                       // với vị trí option 1, khi đó index[1]>0
    12.          if((strstr(argv[i],"/T"))!=NULL)
    13.              index[1]=i;
    14.          if((strstr(argv[i],"/y"))!=NULL) // nếu gặp option2 /y
    15.              index[2]=i;
    16.          if((strstr(argv[i],"/Y"))!=NULL)
    17.              index[2]=i;
    18.          if((strstr(argv[i],"/a"))!=NULL)// nếu gặp option3 /a
    19.              index[3]=i;
    20.          if((strstr(argv[i],"/A"))!=NULL)
    21.              index[3]=i;
    22.          }
    23. //các cau lệnh khác
    24. }
    khi đó em coi như các option đã vào vị trí và để gọi option 1 thì dùng lệnh
    argv[index[1]]
    khi đó không cần biết option1 ở chính xác chỗ nào

    nhưng có 1 chỗ không dùng được, khi dịch thì vẫn được nhưng khi chạy lại bị lỗi mỗi khi đánh lệnh mà có option là lỗi, chương trình bị ngắt ngay ,mà không hiểu vì sao > bro nào biết giải thích cho em với ,em đang rất cần

    khi chạy em đánh lệnh
    c:\ >lrc2srt [tên file nguồn] [tên file đích] /t
    c:\ >lrc2srt [tên file nguồn] [tên file đích] /a
    c:\ >lrc2srt [tên file nguồn] [tên file đích] /a /t

    tái bút nêú đánh lệnh này thì chương trình chạy ra đúng vàn không lỗi
    c:\ >lrc2srt [tên file nguồn] [tên file đích]
    khi không dùng các option thì không sao
    Đã được chỉnh sửa lần cuối bởi quangnh89 : 04-02-2009 lúc 07:20 PM.

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mình nghĩ chắc đoạn code xử lý bị lỗi rồi, đoạn code này mình chạy khi truyền các tham số vào thì ko bị gì cả.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    11 2007
    Nơi ở
    Hà Nội
    Bài viết
    520

    đây là toàn bộ chương trình nguồn , các bác xem hộ em
    đặc biệt là hàm main() nhé

    Chắc hẳn bác nào cũng thích hát và em cũng thế
    vì thế khi bài nào hay là em hay download file nhạc về , nhiều khi download luôn cả video clip để xem cho đã

    Em có bài hát và thường sử dụng minilyric để search lời , nhưng với video clip thì thường người ta chỉ có clip chứ làm gì có phụ đề mà hát theo (hoặc cũng có nhưng ít người làm mà chủ yếu chỉ toàn phụ đề film).Em lại phát hiện ra nhiều bài nhạc trong máy là do họ lấy luôn từ trong các clip , dùng soft chuyển đổi để tạo file nhạc, và lời nhạc vì thế khi sync với file nhạc là cũng đồng thời sync với clip . quá tiện

    do đó em làm ra cái soft này , theo tên của nó thì ai cũng biết là chuyển đổi từ file lrc và cho ta file srt sau đó có thể làm phụ đề cho clip yêu thích và đặt tên nó là lrc2srt

    em dùng compiler của dev C, chỗ nào dài dòng qúa, các bác sửa luôn nhé
    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<string.h>
    4. #include<ctype.h>
    5. #include<stdlib.h>
    6. #define NDMAX 3000
    7.  
    8. typedef struct phantu
    9. {
    10.         int stt,m,n,k,done;
    11.         char tgd[20],tgc[20],nd[NDMAX];
    12. };
    13.  
    14. //Kiem tr xem choi co ki tu ko
    15. int strcheck(char *s)
    16. {
    17.     int i,j;
    18.     for(i=0,j=0;i<strlen(s);++i)
    19.         if(!isspace(s[i]))++j;
    20.     return j;
    21. }
    22.  
    23. //Kiem tra su ton tai cua file
    24. int check_file(char *s)        
    25. {
    26.     FILE *f;
    27.     f=fopen(s,"r");
    28.     if(f==NULL)
    29.         return 0;
    30.     fclose(f);
    31.     return 1;
    32. }
    33. // xoa sl ki tu trong chuoi tu vi tri vt
    34. void strdelete(char *s,int vt,int sl)
    35. {  
    36.     int n=strlen(s),i;
    37.     for (i=vt;i<=n-sl;++i)
    38.         s[i]=s[i+sl];
    39. }
    40.  
    41. //copy sl ki tu tu chuoi nguon vaof chuoi dich tu vt
    42. char *strcopy(char *dich, char *nguon, int vt, int sl)
    43. {    
    44.      int i=strlen(dich),j;
    45.      for(j=vt;j<vt+sl;++j,++i)
    46.          dich[i]=nguon[j];
    47.      dich[i]=0;
    48.      return dich;
    49. }
    50.  
    51. //them ki tu vao chuoi
    52. char *strinsertchr(char *dich,char kt,int vt)
    53. {
    54.      int n=strlen(dich);
    55.      for(int i=n+1;i>vt;--i)
    56.          dich[i]=dich[i-1];
    57.      dich[vt]=kt;
    58.      return dich;
    59.  }
    60.  
    61. //Chuyen doi chuoi cho phuf hop voi du lieu dau vao
    62. char *convert(char*s)
    63. {
    64.  int i=0;
    65.  
    66.  while(i<strlen(s))    
    67.      if((s[i]=='\\')&&(s[i+1]=='\\'))
    68.          strdelete(s,i,1);
    69.      else ++i;
    70.  for(i=0;i<strlen(s);++i)
    71.      if(s[i]=='\\')
    72.          strinsertchr(s,'\\',++i);
    73.  return s;
    74. }
    75.  
    76. //Xac dinh phan mo rong
    77. int ext(char *filename,char *nguon)
    78. {
    79.     int i=-1;
    80.     char e[10]="";
    81.    
    82.     while(!(nguon[++i]=='.'))
    83.         if(nguon[i]=='/') return 4;
    84.     strcopy(e,nguon,i+1,strlen(nguon)-i-1);
    85.     strcpy(filename,"");
    86.     strcopy(filename,nguon,0,i);
    87.     if(!strcmpi(e,"lrc"))       // phan mo rong la lrc
    88.         return 1;
    89.     else if(!strcmpi(e,"srt"))  // phan mo rong la srt
    90.         return 2;
    91.     else if(!strcmpi(e,"txt"))  // phan mo rong la txt
    92.         return 3;
    93.     else return 4;              //unknown
    94. }
    95.  
    96. //khoi tao cho cac phan tu
    97. void khoitao(phantu *y)
    98. {
    99.      y->stt=y->m=y->n=y->k=y->done=0;
    100. }
    101.  
    102. //xu ly tung dong nhap vao
    103. int xulydong(phantu *x,char *dong)
    104. {
    105.     int i=0;
    106.     phantu y;
    107.     khoitao(&y);
    108.    
    109.     if(dong[strlen(dong)-1]==10)
    110.         {
    111.         int j=strlen(dong)-1;
    112.         strdelete(dong,j,1);
    113.         }
    114.    
    115.     while(i<strlen(dong)) // loai bo cac ki tu trong neu co trong chuoi thoi gian
    116.     {
    117.         if(dong[i]==']')
    118.             break;
    119.         if(dong[i]==' ')
    120.             strdelete(dong,i,1);
    121.         else ++i;
    122.     }
    123.     for(i=0;i<strlen(dong);++i)// xac dinh chinh xac chuoi thoi gian trong file lrc
    124.     {
    125.         if(dong[i]=='[') y.m=i;
    126.         else if(dong[i]==':') y.n=i;
    127.         else if(dong[i]=='.')dong[i]=',';
    128.         else if(dong[i]==']')
    129.                  {
    130.                  y.k=i;
    131.                  dong[i]='0';
    132.                  break;
    133.                  }
    134.     }  
    135.     if((dong[y.n+1]<='9')&&(dong[y.n+1]>='0'))// kiem tra xem co phai chuoi thoi gian khong
    136.     {
    137.         strcpy(y.nd,dong);
    138.         strcpy(y.tgd,"00:");
    139.         strcopy(y.tgd,dong,y.m+1,y.k-y.m);// tao chuoi thoi gian
    140.         i=0;
    141.         strdelete(y.nd,0,y.k+1);             //lay noi dung
    142.         y.done=1;
    143.      }
    144.     else y.done=0;
    145.     *x=y;
    146.     return y.done;
    147. }
    148. //ghi tep
    149. void ghitep(FILE *f, phantu x)
    150. {
    151.      fprintf(f,"%d\n",x.stt);
    152.      fprintf(f,"%s --> %s\n",x.tgd,x.tgc);
    153.      fprintf(f,"%s\n\n",x.nd);
    154. }    
    155.  
    156. //xu ly tep lrc
    157. void lrc2srt(FILE*dich,FILE*f,char *tgkt)
    158. {
    159.      char dong[NDMAX];
    160.      int stt,x=0;
    161.      phantu x1,x2;
    162.      
    163.      stt=0;                               //so thu tu cua moi cau hat
    164.      while ((!feof(f))&&(x==0))
    165.          if(fgets(dong,NDMAX,f)!=NULL)    //lay cau hat dau tien
    166.              {
    167.                  if(xulydong(&x1,dong))
    168.                      {
    169.                       x1.stt= ++stt;
    170.                       x=1;
    171.                      }
    172.                  while ((!feof(f))&&(x==1))     //quet lan luot tung cau hat
    173.                      if(fgets(dong,NDMAX,f)!=NULL)
    174.                         {
    175.                          if(xulydong(&x2,dong))
    176.                          x2.stt= ++stt;
    177.                          if(x1.done==1)           // neu cau co chuoi thoi gian thi in
    178.                             {
    179.                             strcpy(x1.tgc,x2.tgd);
    180.                             if(strcheck(x1.nd))   // kiem tra xem co phai dong trong hay khong
    181.                                 ghitep(dich,x1);
    182.                             else stt--;
    183.                             }
    184.                          x1=x2;
    185.                          }
    186.                      else if((x1.done==1)&&strcheck(x1.nd))// gap cau hat cuoi cung
    187.                           {
    188.                           strcpy(x1.tgc,tgkt);
    189.                           ghitep(dich,x1);
    190.                           }
    191.              }
    192. }
    193.  
    194. //Kiem tra su ton tai cua file dich
    195. void kt(char *s)
    196. {
    197.      char ans;
    198.      
    199.      if(check_file(s))              // neu da co file dich ton tai
    200.       {printf("\n");
    201.          do
    202.          {
    203.          printf("Overwrite %s (Yes/No): ",s); //co ghi de hay khong
    204.          scanf("%c",&ans);
    205.          if((toupper(ans)=='N'))              // khong ghi de
    206.              {
    207.              printf("\n\t0 file(s) created.");
    208.              exit(0);
    209.              }
    210.          fflush(stdin);
    211.          }while(toupper(ans)!='Y');           //co ghi de
    212.       }
    213. }
    214.  
    215. //quet file goc lan dau
    216. int quetlanmot(char *filename)                 // quet xem file nguon co dong trong o cuoi file hay khong
    217. {
    218.     int i=0;FILE *f;
    219.    
    220.     f=fopen(filename,"r");
    221.     while(!feof(f))
    222.         if(getc(f)==']')
    223.             i=0;
    224.         else if(!isspace(getc(f)))
    225.             ++i;
    226.     return (!i);//==1 co loi
    227. }
    228.  
    229.  
    230. // gioi thieu va giup do
    231. void help()
    232. {   printf("CHUONG TRINH LRC2SRT VERSION 0.02 Alpha.");
    233.     printf("\nTac gia:quangnh89.");
    234.     printf("\nCopyright (c) 2008-2009.\n");
    235.     printf("\nCreate srt file from lrc file.");
    236.     printf("\nTao file srt tu file lrc da co.\n");
    237.     printf("\nSyntax :  LRC2SRT [source] [destination] [/t]\n\n");
    238.     printf("\nsource\t\t\tfile nguon *.lrc");
    239.     printf("\ndestination\t\tten file dich *.srt");
    240.     printf("\n/t\t\t\tThoi gian ket thuc cua file video hh:mm:ss,milisecond");
    241.     printf("\n\nThoi gian ket thuc can thiet neu trong file lrc khong duoc ket thuc boi mot dong trong. Neu trong file lrc ma ket thuc boi mot dong trong thi thoi gian ket thuc se khong duoc dung.");
    242. printf("\nvi du ve thoi gian 03:07:54,120");
    243.      exit(0);
    244.      }
    245.  
    246. //neu nguoi dung khong chay o che do command thi ham nay duoc thay the
    247. void main2()
    248. {
    249.     char filename[512],s[512],temp1[512],temp[20];
    250.     const int IMAX=10;
    251.     int i,e,g,index[IMAX];
    252.     FILE *f1,*f2;
    253.  
    254.     printf("CHUONG TRINH LRC2SRT VERSION 0.02 Alpha.");
    255.     printf("\nDe xem huong dan su dung lenh \"LRC2SRT /?\"");
    256.     printf("\nNhap duong dan file nguon :");
    257.     fflush(stdin);
    258.     gets(s);
    259.     if (!strlen(s)) exit(0);
    260.     convert(s);
    261.     if(!check_file(s))
    262.         {
    263.         printf("\nKhong tim thay file !\n");
    264.         exit(0);
    265.         }
    266.      else{
    267.           e=ext(temp1,s);
    268.           strcopy(temp1,".srt",0,4);
    269.           printf("\nNhap duong dan file dich,mac dinh %s se duoc dung thay the",temp1);
    270.           printf("\nNhap duong dan file dich :");
    271.           fflush(stdin);
    272.           gets(filename);
    273.           convert(filename);
    274.           if(!strlen(filename))
    275.               {
    276.               strcpy(filename,temp1);
    277.               printf("%s duoc su dung.",filename);
    278.               }
    279.           kt(filename);
    280.              if(quetlanmot(s))
    281.                  {
    282.                  printf("Nhap thoi gian ket thuc:");
    283.                  fflush(stdin);
    284.                  gets(temp);
    285.                  }
    286.              else strcpy(temp,"");
    287.              f1=fopen(s,"r");
    288.              f2=fopen(filename,"w");
    289.              lrc2srt(f2,f1,temp);
    290.              fclose(f1);
    291.              fclose(f2);
    292.              }
    293. }
    294.  
    295. //che do command
    296. int main(int argc,char *argv[])
    297. {
    298.     char filename[512],temp1[512],temp2[512],temp[20];
    299.      const int IMAX=10;
    300.      int i,e,g,index[IMAX];
    301.     FILE *f1,*f2;
    302.    
    303.     if(argc==1)
    304.         {
    305.         main2();
    306.         exit(0);
    307.         }
    308.     for (i=0;i<10;++i)
    309.         index[i]=0;
    310.    
    311.     for(i=1;i<argc;++i)               //chuyen doi tham so truyen vao
    312.         convert(argv[i]);
    313.        
    314.     for(i=1;i<argc;++i)
    315.         {
    316.          if((e=ext(temp1,argv[i]))==1)// xac dinh file lrc
    317.              index[1]=i;
    318.          else if((g=ext(temp2,argv[i]))==2)//file srt
    319.              index[2]=i;
    320.          else if((strstr(argv[i],"/t"))!=NULL)
    321.              index[3]=i;
    322.          else if((strstr(argv[i],"/T"))!=NULL)
    323.              index[3]=i;
    324.          else if((strstr(argv[i],"/?"))!=NULL)
    325.               help();              
    326.         }
    327.        
    328.        
    329.     for(i=1;i<argc;++i)               //chuyen doi tham so truyen vao cho phu hop voi C
    330.         convert(argv[i]);
    331.     if(index[1])
    332.         if(!check_file(argv[index[1]]))// kiem tra file nguon
    333.         {
    334.         printf("\nKhong tim thay file !\n");
    335.         exit(0);
    336.         }
    337.         else {
    338.              if(index[2])               // kiem tra ten file dich file dich
    339.                  strcpy(filename,argv[index[2]]);
    340.              else{
    341.                  strcpy(filename,temp1);
    342.                  strcopy(filename,".srt",0,4);
    343.                  }
    344.              kt(filename);
    345.              if(quetlanmot(argv[index[1]]))
    346.                {
    347.                if(index[3])       //kiem tra xem co nhap chuoi thoi gian ket thuc khong
    348.                    {
    349.                    strcpy(temp,argv[index[3]]);
    350.                    strdelete(temp,0,2);
    351.                    }
    352.                else
    353.                  {
    354.                  printf("Nhap thoi gian ket thuc:");
    355.                  fflush(stdin);
    356.                  gets(temp);
    357.                  }
    358.                }
    359.                else strcpy(temp,"");
    360.                //thuc hien xu ly vaf cho ket qua
    361.              f1=fopen(argv[index[1]],"r");
    362.              f2=fopen(filename,"w");
    363.              lrc2srt(f2,f1,temp);
    364.              fclose(f1);
    365.              fclose(f2);
    366.              }
    367. }
    quên em đính kèm file lrc và file srt mà lrc2srt tạo ra để các bác test luôn
    đây là link video
    Taylor Swift - Love Story (OFFICIAL VIDEO FULL)
    http://www.youtube.com/watch?v=JSBremJzMR4
    đây là file nhạc của bài này (nghe cũng được lắm )
    http://www.nhaccuatui.com/nghe?M=Z6aLno2ylS
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi quangnh89 : 05-02-2009 lúc 11:03 AM.

  4. #4
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Bạn sai dòng thứ 2 trong hàm main, sửa lại thế này :

    C++ Code:
    1. int i,e,g, index[3];
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  5. #5
    Ngày gia nhập
    11 2007
    Nơi ở
    Hà Nội
    Bài viết
    520

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Bạn sai dòng thứ 2 trong hàm main, sửa lại thế này :

    C++ Code:
    1. int i,e,g, index[3];
    cái đấy là lúc nãy em gõ nhầm thôi
    bác sửa lại như trong bài trên em vừa edit lại
    C++ Code:
    1.      const int IMAX=10;
    2.      int i,e,g,index[IMAX];
    Đã được chỉnh sửa lần cuối bởi quangnh89 : 05-02-2009 lúc 10:11 AM.

  6. #6
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mặc định hỏi về cách sử lý parameters trong C

    Mình chưa nắm được ý tưởng của bạn thế nào nên ko sửa giùm bạn được. Nó sai ở chỗ bạn dùng hàm ext để phân tích đuôi file. Trong vòng for bạn lại gọi hàm ext. Nếu truyền vào file thì hàm này chạy đúng nhưng khi i vượt qua 3, thì hàm ext chạy sai. Ví dụ bạn truyền "/t" vào hàm ext, vòng while chỉ dừng khi tìm ra dấu "." và như thế nó sẽ chạy mãi đến khi đụng vị trí "rác" mà vô tình có chứa dấu "." -> crash chương trình.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  7. #7
    Ngày gia nhập
    11 2007
    Nơi ở
    Hà Nội
    Bài viết
    520

    Cám ơn anh mèo rất nhiều , chỗ đó em không nghĩ ra
    Chương trình giờ hoạt động trơn tru rồi
    em cũng sửa hàm ấy trong bài trên rồi
    Đã được chỉnh sửa lần cuối bởi quangnh89 : 05-02-2009 lúc 10:58 AM.

Các đề tài tương tự

  1. Bài tập C Lỗi too few parameters và chữa hộ e bài tập
    Gửi bởi ko0lken trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 19-05-2013, 08:27 PM
  2. MS SQL với C# Stored proc không có Parameters truyền vào thì có nhanh hơn Stored proc có Parameters truyền vào
    Gửi bởi h034 trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 1
    Bài viết cuối: 17-12-2012, 10:37 PM
  3. không thể insert những biến đặt trong Parameters
    Gửi bởi thuan trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 06-10-2011, 08:38 AM
  4. Lỗi câu lệnh sqlcommand.Parameters.Add(sqldatareader.GetInt32(0 ))
    Gửi bởi tungwert trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 12-06-2010, 04:40 PM
  5. Cách dùng Parameters
    Gửi bởi nguyencuonginfo trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 1
    Bài viết cuối: 25-08-2009, 07:55 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn