簡體   English   中英

如何從C中的字符串保存最后一個字符?

[英]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(&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”-這是一個測試)-使用.c應該如何失敗

reti = regexec(&regex, "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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM