2015-04-06 70 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

相关问题