Как обрезать C char *? - PullRequest
       23

Как обрезать C char *?

10 голосов
/ 26 июня 2011

Так просто. Я на C ++, кстати. Я прочитал функции библиотеки cstdlib cplusplus.com, но не могу найти для этого простую функцию. Я знаю длину символа, мне нужно только стереть последние три символа из него. Я могу использовать строку C ++, но это для обработки файлов, которые используют char *, и я не хочу делать преобразования из строки в C char.

Ответы [ 5 ]

24 голосов
/ 26 июня 2011

Если вам не нужно копировать строку в другое место и вы можете изменить ее

/* make sure strlen(name) >= 3 */
namelen = strlen(name); /* possibly you've saved the length previously */
name[namelen - 3] = 0;

Если вам нужно скопировать его (потому что это строковый литерал или вы хотите сохранить оригинал)

/* make sure strlen(name) >= 3 */
namelen = strlen(name); /* possibly you've saved the length previously */
strncpy(copy, name, namelen - 3);
/* add a final null terminator */
copy[namelen - 3] = 0;
6 голосов
/ 26 июня 2011

Я думаю, что некоторые из ваших сообщений были потеряны в переводе.

Чтобы обрезать строку в C, вы можете просто вставить завершающий нулевой символ в нужную позицию. Все стандартные функции будут обрабатывать строку как новую длину.

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

int main(void)
{
    char string[] = "one one two three five eight thirteen twenty-one";

    printf("%s\n", string);

    string[strlen(string) - 3]  = '\0';

    printf("%s\n", string);

    return 0;
}
4 голосов
/ 26 июня 2011

Если вы знаете длину строки, вы можете использовать арифметику указателя, чтобы получить строку с последними тремя символами:

const char* mystring = "abc123";
const int len = 6;

const char* substring = mystring + len - 3;

Обратите внимание, что substring указывает на ту же память, что и mystring, и действует только до тех пор, пока mystring действует и остается без изменений. Причина, по которой это работает, заключается в том, что строка c не имеет никаких специальных маркеров в начале, только окончание NULL в конце.

Я истолковал ваш вопрос как желание трех последних персонажей, избавление от начала, в отличие от того, как Дэвид Хеффернан прочитал его, один из нас явно неправ.

0 голосов
/ 26 июня 2011

Это может помочь понять, как C char* "строки" работают:

Вы начинаете читать их с символа, на который указывает символ *, пока не достигнете символа \0 (или просто 0).

Итак, если у меня есть

char* str = "theFile.nam";

, тогда str+3 представляет строку File.nam.

Но вы хотите удалить последние три символа, так что вы хотитечто-то вроде:

char str2[9];
strncpy (str2,str,8); // now str2 contains "theFile.#" where # is some character you don't know about
str2[8]='\0'; // now str2 contains "theFile.\0" and is a proper char* string.
0 голосов
/ 26 июня 2011
bool TakeOutLastThreeChars(char* src, int len) {
  if (len < 3) return false;
  memset(src + len - 3, 0, 3);
  return true;
}

Я предполагаю, что изменение строковой памяти безопасно, поскольку вы сказали стереть последние три символа.Я просто перезаписываю последние три символа "NULL" или 0.

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