2010-08-31 2 views
8
char out_file_name[30]; 


ogSize = strlen(FileName); //i.e. - FileName_anylength.log (always.log) 
ogSize -= strlen(IN_FILE_SUFFIX); //amount of chars before .log 

strncpy(out_file_name, FileName, ogSize); //out_file_name now is FileName_anylength (without the .log) 

Это лучший способ сделать это?Есть ли другой способ обрезать строку?

Также, как я могу защитить, что ogSize не превышает 30 символов, поскольку он поступает с пользовательского ввода?

Thank you.

+1

Вы имеете в виду предварять? Или извлечение струны? Обрезать? – 2010-08-31 23:30:47

+1

Я думаю, вы имеете в виду «truncate» (вы хотите удалить элементы из конца строки, усекая ее до более короткой длины, правильно?) –

+0

truncate - это тот. Благодарю. К сожалению, английский - это мой первый язык ... да во-первых, вот почему это так плохо. –

ответ

17

С строкой в ​​стиле C вы можете просто установить символ, который хотите обрезать, на \0.

Что касается вашего второго вопроса, в основном вы проверяете. Или вы выделяете столько памяти, сколько вам нужно, в зависимости от размера строки (не забудьте указать номер для этого \0).

+1

+1 Хороший трюк.Strlen остановится в первом экземпляре '\ 0' – 2010-08-31 23:32:37

+0

@jkerian: Хорошее решение, спасибо. –

2

Дайте это посмотреть:

char *trunc; 
char *outfile; 

strdup(outfile, FileName); 

if (((trunc = strstr(out_file_name, ".log")) != NULL) 
*trunc = '\0'; 

return (outfile); // assumes returning result from function 
+0

strdup не является ANSI C (нет C89, нет C99) – user411313

+0

Это достаточно хорошо известно и стандартно, чтобы его можно было безопасно использовать в большинстве сред: IEEE 1003.1, 2004, (http://www.opengroup.org/onlinepubs/009695399/functions /strdup.html); SVr4, 4.3BSD, POSIX.1-2001 (http://linux.die.net/man/3/strdup) и Unix 98 (http://www.mkssoftware.com/docs/man3/strdup.3. осина). Кроме того, мое решение не делает никаких предположений о длине исходной строки и сохраняет ее. – BillP3rd

2

Принимая ваш последний вопрос первым, обеспечивая максимальный размер довольно легко. Как правило, вы хотите использовать fgets для чтения строки. Это позволяет указать максимальную длину. В качестве альтернативы вы можете указать максимальный размер в формате scanf (например, "%29s" или "%29[^\n]"). Обратите внимание на разницу между ними: с fgets вы указываете размер буфера, но с scanf вы указываете один размер меньше, чем размер буфера (т. Е. Максимальное количество символов для чтения).

Что касается первого вопроса: да, в целом есть лучшие способы. strncpy - странная функция, первоначально написанная для довольно конкретной цели, и (если честно), вероятно, должна быть удалена из стандартной библиотеки, потому что, хотя она кажется, как это должно быть полезно, она почти никогда не бывает.

Я бы, наверное, поступил иначе. Одним из возможных вариантов было бы использовать snprintf, что-то вроде:

snprintf(
    out_file_name, 
    sizeof(out_file_name), 
    "%*s", 
    strlen(FileName) - strlen(IN_FILE_SUFFIX), FileName); 
+1

if out_file_name не является массивом, ваш пример работает не так. snprintf is not C89 – user411313

2

используйте fgets(), чтобы прочитать строку от пользователя, таким образом, вы можете указать, что максимальная длина строки

char* from = FileName; 
char* to = out_file_name; 
int curLen = 0; 

do 
{ 
    *to++=*from++ 
} 
while(*from && *from!='.' && ++curLen < ogSize); 

*to='\0'; 
+1

работает не более чем на один. in от – user411313

1

Вы можете вставьте нуль в строку, чтобы сократить ее. Ниже функция strstr() используется для поиска адреса первого вхождения «.log». После этого вы можете вычесть два адреса друг от друга, чтобы узнать длину имени и где вставить нуль.

int main() { 
    char suffix[] = ".log"; 
    char filename[] = "FileName_anylength.log"; 
    char* end_address = strstr(filename, suffix); 
    filename[end_address-filename] = 0; 
    printf("%s", filename); 
} 
+1

@ BillP3rd - Извиняющийся Билл, только что заметил, что у нас были похожие ответы. Мне нравится твоя лучше, нет вычитания. - приветствия :) – skimobear

1
char out_file_name[30]; 
char *suffix=".log"; 
size_t IN_FILE_SUFFIX = strlen(suffix); 

/* also works, if suffix occurs more than 1 time or never ! */ 
if(strstr(out_file_name, suffix)) 
    out_file_name[ strlen(out_file_name) - IN_FILE_SUFFIX ] = 0; 

или

char out_file_name[30]; 
char *suffix=".log"; 
size_t IN_FILE_SUFFIX = strlen(suffix); 

/* also works, if suffix occurs more than 1 time or never ! */ 
if(strstr(out_file_name, suffix)) 
{ 
    char format[20]; 
    sprintf(format, "%%.%ds", strlen(out_file_name) - IN_FILE_SUFFIX); 
    sprintf(out_file_name, format, out_file_name); 
} 
Смежные вопросы