2015-04-06 69 views
0

我想保存字符串中的最後一個字符?任何想法如何做到這一點?如何保存C中最後一個字符串?

目標:我正在編寫一個程序,其中一項任務是使用Unix/POSIX搜索文件擴展名。舉例來說,如果用戶輸入:

./r_client本地主機-name「的* .c」

,應儘可能返回名稱.c文件類型的擴展名的所有文件。因此,我想抓住最後一個字符的strcat它下面的代碼

,然後通過搜索我的目錄如下:

下面

是使用正則表達式

#include <sys/types.h> 
#include <regex.h> 
#include <stdio.h> 

int main(int argc, char *argv[]){ 
     regex_t regex; 
     int reti; 
     char msgbuf[100]; 

     char *name = "*.c"; 
     // grab last char, strcat it to -> "[a-zA-Z0-9]\.c$" 
     // because it could be '.h', '.x', etc.  

/* Compile regular expression */ 
     reti = regcomp(&regex, "[a-zA-Z0-9]\.c$", 0); 
     if(reti){ fprintf(stderr, "Could not compile regex\n"); exit(1); } 

/* Execute regular expression */ 
     reti = regexec(&regex, "e09s*fdf.ec", 0, NULL, 0); 
     if(!reti){ 
       puts("Match"); 
     } 
     else if(reti == REG_NOMATCH){ 
       puts("No match"); 
     } 
     else{ 
       regerror(reti, &regex, msgbuf, sizeof(msgbuf)); 
       fprintf(stderr, "Regex match failed: %s\n", msgbuf); 
       exit(1); 
     } 

/* Free compiled regular expression if you want to use the regex_t again */ 
    regfree(&regex); 

     return 0; 
} 

//然後的示例代碼調用( 「e09s * fdf.ec」 - 這是一個測試) - 它應該怎麼失敗的W/.C

reti = regexec(&regex, "e09s*fdf.ec", 0, NULL, 0); 

將被替換爲:dir_entry-> d_name

除非有更好的方法來做到這一點?

感謝您的幫助提前

+0

你想支持殼水珠的文件名?如果這是你想要做的,使用'glob()'或'wordexp()'。沒有必要重新發明輪子。 – fuz 2015-04-06 22:49:58

回答

0

我想你想是這樣的:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char dest[255]; 

char get_last_char(char* s) 
{ 
     return s[strlen(s) - 1]; 
} 

int main(int argc, char *argv[]) 
{ 
     char c = get_last_char(argv[1]); 
     char s[2]; 
     s[0] = c; 
     s[1] = '\0'; 

     strcat(dest, "[a-zA-Z0-9]\\."); 
     strcat(dest, s); 
     strcat(dest, "$"); 
     printf("%s\n", dest); 

     exit(0); 
} 

例子:

$ ./concatenate1 "*.x" 
[a-zA-Z0-9]\.x$ 
$ ./concatenate1 "*.c" 
[a-zA-Z0-9]\.c$ 
$ ./concatenate1 "*.h" 
[a-zA-Z0-9]\.h$ 

而且,考慮使用snprintf()而不是多個strcat()如果你發現從長遠來看更容易。

編輯: 下面的代碼應該做的工作。缺少一件東西並標記爲TODO - 驗證。你永遠不能確定用戶會傳遞正確的數據。如果您的代碼依賴於點後面不多於x個字符的事實,請選中remaining_chars_count,然後執行您認爲合適的操作。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
     char *temp = strstr(argv[1], "."); 
     if (!temp) 
       { 
         printf("No dot found.\n"); 
         exit(1); 
       } 

     unsigned int remaining_chars_count = strlen(argv[1]) - (temp - argv[1]) - 1; 

     /* TODO: add validation at this point! */ 

     size_t output_string_length = remaining_chars_count; 

     char output_string[output_string_length]; 
     unsigned output_string_count = remaining_chars_count; 

     size_t i = strlen(argv[1]); 
     for (i; i > strlen(argv[1]) - remaining_chars_count; i--) 
       { 
         output_string[output_string_count - 1] = argv[1][i - 1]; 
         --output_string_count; 
       } 

     output_string[output_string_length] = '\0'; 
     printf("OUTPUT: %s\n", output_string); 
     exit(0); 

} 

例子:

$ ./dot1 "*1134..a" 
OUTPUT: .a 
$ ./dot1 abc.a 
OUTPUT: a 
$ ./dot1 "*a.hx" 
OUTPUT: hx 
+0

真棒謝謝你!關於如何在一段時間之前獲得所有字符的任何想法?例如,如果該文件是'* .xyz',那麼在該時間段之後如何獲取所有字符?知道三個字母的擴展名將是最大的 – linkedlist 2015-04-06 13:52:26

+0

@linkedlist:查看更新的答案 – 2015-04-06 17:43:45

相關問題