0

次のように、文字列からベース名を抽出したい

/opt/home/etc/sample

つまり、 を返す長いsample文字列、または最後の文字の後の部分文字列を解析したいのです/。文字列の長さは任意です。

これはどのように行うことができますか?

4

3 に答える 3

6
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);
}
于 2012-05-16T07:01:07.820 に答える
0

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せずに使用することもできます。

于 2012-07-02T13:03:15.217 に答える
0

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 コードにいくつかの小さなエラーがないか確認してください

于 2012-05-16T07:02:45.123 に答える