Проблема указателя C char странные значения, конкатонированные в конце - PullRequest
0 голосов
/ 24 апреля 2011

Привет, у меня проблемы с этой функцией.По какой-то причине странные значения добавляются в строку в случайное время.

/* ex: path = /usr/src/data returns: /usr/src */``
char* get_pathname(char* path) {
  char* pathname;
  char* temp;
  int filenamelength;
  int pathlength;
  temp = get_filename(path); //name of file within original path
  filenamelength = strlen(temp);
  printf("strlen(temp) %d\n", strlen(temp));
  printf("strlen(path) %d\n", strlen(path));
  pathlength = strlen(path);
  pathname = malloc((pathlength-filenamelength-1));
  strncpy(pathname, path, pathlength-filenamelength-1);

  return pathname;
}

/* ex: path /usr/src/data returns: data */
char* get_filename(char* path) {
  char* get_filename(char* path){
  char* filename;
  char* temp = strrchr(path, '/')+1; //name of file within original path
  filename = malloc(sizeof(char) * (strlen(path) + 1));
  strcpy(filename, temp);
  return filename;
}

Ответы [ 3 ]

4 голосов
/ 24 апреля 2011

strncpy не завершается 0, когда скопированная строка больше или точно соответствует переданному размеру.

pathname = malloc((pathlength-filenamelength-1));
strncpy(pathname, path, pathlength-filenamelength-1);

Изменить на:

pathname = malloc(pathlength-filenamelength);
                                          ^^^
strncpy(pathname, path, pathlength-filenamelength-1);
pathname[pathlength-filenamelength-1] = 0;
1 голос
/ 24 апреля 2011

Будет ли это работать для вас?

char *get_path(char *path)
{
    char *fpath = NULL;
    char *slash = NULL;
    if(path == NULL) goto error;
    fpath = strdup(path);
    if(fpath == NULL) goto error; 
    slash = strrchr(fpath, '/');
    if(slash != NULL) *slash = '\0';
error:
    return fpath;

}

char *get_filename(char *path)
{
    char *slash = NULL;
    char *fname = NULL;
    if(path == NULL) goto error;
    slash = strrchr(path, '/');
    fname = (slash != NULL) ? strdup(slash + 1) : NULL;
error:
    return fname;
}
1 голос
/ 24 апреля 2011
static void *
xmalloc(size_t n)
{
  void *obj = malloc(n);
  if (obj == NULL) {
    perror("xmalloc");
    exit(EXIT_FAILURE);
  }
  return obj;
}

char *
get_pathname(const char *path)
{
  char *slash = strrchr('/', path);
  if (slash == NULL) {
    char *dot = xmalloc(2);
    strcpy(dot, ".");
    return dot;
  }
  char *parent = xmalloc((slash - path) + 1);
  memcpy(parent, path, slash - path);
  parent[slash - path] = '\0';
  return parent;
}

char *
get_filename(const char *path)
{
  const char *slash = strrchr('/', path);
  const char *filename = (slash == NULL) ? "" : (slash + 1);
  char *result = xmalloc(strlen(filename) + 1);
  strcpy(result, filename);
  return result;
}

Я добавил недостающую обработку ошибок и случаи, когда нет косой черты в данном пути. В исходном коде у вас была утечка памяти в get_pathname: вы звонили malloc через get_filename, но не free этой памяти после того, как вы ее использовали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...