web-dev-qa-db-ja.com

C char *を切り捨てる方法は?

それと同じくらい簡単です。私はC++を使っています。 cplusplus.comのcstdlibライブラリ関数を読みましたが、そのための簡単な関数が見つかりません。 charの長さはわかっています。必要なのはerase最後の3文字だけです。 C++文字列を使用できますが、これはchar *を使用するファイルを処理するためのものであり、文字列からC charへの変換を行いたくありません。

11
erandros

文字列をどこかにコピーする必要がなく、変更できる場合

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

投稿の一部が翻訳で失われたと思います。

Cで文字列を切り捨てるには、目的の位置に終端のnull文字を挿入するだけです。すべての標準関数は、文字列を新しい長さとして扱います。

#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;
}
6

文字列の長さがわかっている場合は、ポインタ演算を使用して、最後の3文字の文字列を取得できます。

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

const char* substring = mystring + len - 3;

substringmystringと同じメモリを指し、mystringが有効で変更されていない限り有効であることに注意してください。これが機能する理由は、c文字列には最初に特別なマーカーがなく、最後にNULL終端しかないためです。

David Heffernanがどのように読んだのとは対照的に、私はあなたの質問を最後の3文字が必要であり、最初を取り除くと解釈しました、私たちの1人は明らかに間違っています。

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

erase最後の3文字と言ったので、文字列メモリの変更は安全だと思います。最後の3文字を「NULL」または0で上書きしています。

0
cdiggins

C char* "strings"がどのように機能するかを理解するのに役立つかもしれません:

Char *が指すcharから、\0 char(または単に0)に到達するまで、それらを読み取り始めます。

だから私が持っているなら

char* str = "theFile.nam";

次に、str+3は文字列File.namを表します。

しかし、最後の3文字を削除したいので、次のようにします。

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
trutheality