Измените имена файлов. Я хочу, чтобы мой код работал быстрее

Определенная функция char * имя файла (char * файл, int num) Требования: Введите имя файла: test.txt 1 Вывод: test_1.txt Ввод: test Вывод: test_1

Вот мой код

char *filename(char *file, int num)
{
    if(NULL == file || num <= 0)        
    {
        printf("parameter error\n");
        return -1;
    }

    char *buf = file, *ptr1, *ptr2, *ptr3;
    char temp[num];

    while (*buf != '.' && *buf != '\0') 
    {
        buf++;
        if(*buf == '\0')
        {
            strcat(file ,"_1");
            return 0;
        }
    }

    ptr1 = strtok(file, ". ");  
    ptr2 = strtok(NULL, ". ");  
    ptr3 = strtok(NULL, ". ");  

    strcpy(temp, ptr2); 

    strcat(file, "_");  
    strcat(file, ptr3); 
    strcat(file, ".");  
    strcat(file, temp); 

    return 0;
}

person B.A    schedule 17.07.2016    source источник
comment
return -1? Конечно, вы можете придумать что-то более подходящее для возврата сюда (или изменить прототип функции, чтобы он возвращал int). Также, пожалуйста, объясните, в чем именно проблема. Выводить здесь свой код вместе с Я хочу в заголовке — это очень плохой способ продемонстрировать свои усилия по решению проблемы или даже объяснить, в чем именно заключается проблема (т. е. что заставляет вас думать, что ваш код недостаточно быстро)!   -  person barak manos    schedule 17.07.2016
comment
return -1 не годится, я хочу получить ошибку параметра, а затем выйти.   -  person B.A    schedule 17.07.2016
comment
Вы нашли терминатор строки, где вы могли бы сделать strcpy(buf,"_1");, но вы вызываете strcat, который будет искать терминатор строки снова и снова.   -  person Weather Vane    schedule 17.07.2016
comment
всегда проверяйте (!=NULL) возвращаемое значение из strtok(), чтобы убедиться, что операция прошла успешно. Откуда вы знаете, что в массиве буферов, на который указывает file, достаточно места для хранения новых символов.   -  person user3629249    schedule 17.07.2016
comment
вы знакомы с функцией: basename()?   -  person user3629249    schedule 17.07.2016
comment
предложите вызывающей стороне проверить параметры командной строки, а не ждать, пока будет вызвана опубликованная функция.   -  person user3629249    schedule 17.07.2016


Ответы (1)


следующий код компилируется чисто и выполняет желаемую функцию

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

#define MAX_DIGIT_LEN (15)

char *filename(char *file, int num)
{
    char * modifiedFileName = NULL;
    if( NULL == (modifiedFileName = malloc( strlen( file) +MAX_DIGIT_LEN ) ) )
    {
        perror( "malloc for room for expanded file name failed");
        //exit( EXIT_FAILURE );
        return NULL;
    }

    // implied else, malloc successful

    char * base = NULL;
    if( NULL == (base =  strtok( file, ".") ) )
    {
        perror( "strtok failed to find . in file name");
        //exit( EXIT_FAILURE );
        return NULL;
    }

    // implied else, strtok found .

    strcpy( modifiedFileName, base );
    char newChars[ MAX_DIGIT_LEN ] = {'\0'};  // 15 to allow for large numbers
    sprintf( newChars, "_%d.", num);

    strcat( modifiedFileName, newChars );

    char * ext = NULL;
    ext = base + strlen(base);

    strcat( modifiedFileName, ext );

    return( modifiedFileName );
} // end function: filename

Конечно, вызывающая сторона должна будет передать возвращенный указатель на free(), когда закончит его использование.

person user3629249    schedule 17.07.2016