Как удалить последнее вхождение строки из другой строки? - PullRequest
1 голос
/ 01 ноября 2011

Скажем, мне нужно удалить последнее вхождение строки из другой строки.Как мне это сделать?

Чтобы уточнить, у меня есть имя файла в строке ac (gchar * или char *)

C: \ SomeDir \ SomeFolder \MyFile.pdf

, и я хочу удалить расширение .pdf и изменить его на другое, например .txt или .png .Какой наименее хлопотный, но эффективный, удобный и кроссплатформенный способ сделать это?Спасибо.

note : я знаю, что это очень просто сделать в C ++, но для этого проекта я абсолютно ДОЛЖЕН использовать C и никакой другой язык.(академическое требование)

note 2 : Хотя вы можете предложить другую стороннюю библиотеку, в настоящее время у меня есть доступ только к стандартной библиотеке C и GLib.

note 3 : я искал похожие вопросы с тегом "C", но не могу найти ни одного.

Ответы [ 4 ]

1 голос
/ 01 ноября 2011

Просто изменив вышеуказанный код 'strtok' с помощью функции 'strrchr'

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_PATH 255

int main() 
{
  char f[MAX_PATH] = "dir\\file.pdf";
  char f1[MAX_PATH];
  char ext[] = ".tmp";
  char *ptr = NULL;
  // find the last occurance of '.' to replace
  ptr = strrchr(f, '.');
  // continue to change only if there is a match found
  if (ptr != NULL) {
    snprintf(f1, (ptr-f)+1, "%s", f);
    strcat(f1, ext);
  }
  printf("%s\n", f1);
  return 1;
}
1 голос
/ 01 ноября 2011

Обычно я использовал бы функцию «splitpath» для разделения всех четырех частей полного пути (dir, path, name, ext). С наилучшими пожеланиями Oliver

1 голос
/ 01 ноября 2011
char fil[] = "C:\\SomeDir\\SomeFolder\\MyFile.pdf";
char fil2[1000];
char extension[] = ".tmp";

// search for . and add new extension
sprintf(fil2, "%s%s", strtok(fil, "."), extension);
printf("%s\n", fil2);
1 голос
/ 01 ноября 2011

взгляните на базовое имя.

NAME
dirname, basename - Parse pathname components

SYNOPSIS
#include <libgen.h>

char *dirname(char *path);
char *basename(char *path);

DESCRIPTION
Warning: there are two different functions basename() - see below.
The functions dirname() and basename() break a null-terminated
pathname string into directory and filename components. In the
usual case, dirname() returns the string up to, but not including,
the final ’/’, and basename() returns the component following the
final ’/’. Trailing ’/’ characters are not counted as part of the
pathname.
...