Как удалять с типа char*?

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

5 ответов


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

/* 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;

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

чтобы усечь строку в 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]  = '';

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

    return 0;
}

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

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

const char* substring = mystring + len - 3;

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

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


bool TakeOutLastThreeChars(char* src, int len) {
  if (len < 3) return false;
  memset(src + len - 3, 0, 3);
  return true;
}

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


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

вы начинаете читать их с символа, на который указывает char*, пока не нажмете char (или просто 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]=''; // now str2 contains "theFile." and is a proper char* string.