[英]How to save the last char from a string in C?
我正在嘗試從字符串中保存最后一個字符? 有關如何執行此操作的任何想法?
目標:我目前正在編寫一個程序,其中的一項任務是使用Unix / POSIX搜索文件擴展名。 例如,如果用戶輸入:
./r_client本地主機-名稱'* .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(®ex, "[a-zA-Z0-9]\.c$", 0);
if( reti ){ fprintf(stderr, "Could not compile regex\n"); exit(1); }
/* Execute regular expression */
reti = regexec(®ex, "e09s*fdf.ec", 0, NULL, 0);
if( !reti ){
puts("Match");
}
else if( reti == REG_NOMATCH ){
puts("No match");
}
else{
regerror(reti, ®ex, 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(®ex);
return 0;
}
//然后調用(“ e09s * fdf.ec”-這是一個測試)-使用.c應該如何失敗
reti = regexec(®ex, "e09s*fdf.ec", 0, NULL, 0);
將替換為:dir_entry-> d_name
除非有更好的方法可以做到這一點?
謝謝您的幫助
我想你想要這樣的東西:
#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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.