次のように、文字列からベース名を抽出したい
/opt/home/etc/sample
つまり、 を返す長いsample
文字列、または最後の文字の後の部分文字列を解析したいのです/
。文字列の長さは任意です。
これはどのように行うことができますか?
char *input = "/opt/home/etc/sample";
char *output = NULL;
output = strrchr(input, '/');
if(output != NULL)
{
printf("%s\n", output);
}
または、それ以外の場合は、自分ですべてを解析しようとすることができます (以下のコードは単なるサンプルであり、すべてのエラーと境界条件を処理するわけではありません。自分で試して学習することができます)
char *input = "/opt/home/etc/sample";
int len = 0;
char *temp = NULL;
len = strlen(input);
temp = input + (len-1);
len--;
while((*temp != '/') && (len >= 0))
{
temp--;
len--;
}
if(len>=0)
{
printf("%s\n", temp);
}
POSIX にはbasename
/関数があります。dirname
それらの戻り値は、静的メモリまたは入力のサフィックスのいずれかを指すため、解放する必要はありません。これは、文字列を自分で分割するよりも簡単かもしれません:
// assuming you own *path:
char *file = basename(path);
char *dir = dirname(path); //that's all!
path
また、 is"."
または".."
orの特殊なケースも処理します"foo/"
(その場合、basename は"."
正しいものです)。
ただし、文字列を所有していない場合は注意してください。非 const 引数を取り、それを変更する可能性があります。
basename
で本当に使用する必要がある場合const char *
、解決策はほぼ同じです
#include <libgen.h> // POSIX
void die(const char * errormessage);
/* version of basename(3) that does not modify its argument.
* This assumes that "path" is correctly 0-terminated!
* Please free() the return value after use. */
char * basename_safe(const char * path)
{
char * result;
char * what_basename_says;
if (!path) {
// return a pointer to ".":
result = malloc(2 * sizeof(char));
if (!result) die("malloc failed!");
result[0] = '.';
result[1] = 0;
return result;
}
// in case path is the empty string, we need 2 chars to store the result ".",
// so add 2:
result = malloc((2 + strlen(path)) * sizeof(char));
if (!result) die("malloc failed");
// basename wants write access to its argument:
strcpy(result, path);
what_basename_says = basename(result);
// now what_basename_says actually may be a pointer into *result.
strcpy(result, what_basename_says);
// to allow for free(result)
return result;
}
しかし、前に述べたように*path
、 を変更できることがわかっている場合は、これらすべてを使用basename
せずに使用することもできます。
strtok_r を使用できます
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="This/a/sample/string";
char * pch;
char * ans;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok_r (str,"/");
if(pch==NULL)
ans = str;
while (pch != NULL)
{
ans = pch;
pch = strtok_r (NULL, "/");
}
return 0;
}
PS コードにいくつかの小さなエラーがないか確認してください