1

次のようなcstdlibを使用せずに、文字列リテラルの長さ(nullターミネータを指定または取得)を取得するにはどうすればよいですか。

char* foo = "foobar";
cout << sizeof(foo) << endl; //Always outputs 4
cout << sizeof(*foo) << endl; //Always outputs 1

連結に文字列リテラルが含まれる場合と含まれない場合がある文字列に対して、+演算子をオーバーロードする必要があります。渡されるchar*(またはchar [])の長さを知らずに、文字列にメモリを割り当てる方法はありません。

4

6 に答える 6

6

foo は文字列へのポインタです。はい、これは一定の文字列ですがchar*、結局のところは です。

特に、char ポインタ ( foo) のサイズは 4 バイト (32 ビット システム [つまり、4 バイト ポインタを持つシステム]) であり、char ( *foo) のサイズは 1 バイトです。

文字列リテラルへのポインタを使用する場合、文字列の長さを知る (標準的な) 方法はありません。

ただし、配列を使用するとサイズを知ることができます。

char foo[] = "some string";
size_t len = sizeof(foo) - 1;
于 2013-02-26T23:23:28.890 に答える
3
#include <cstring>
std::size_t length = std::strlen(foo);

何らかの理由でライブラリを使用できない場合は編集してから、独自の strlen を展開してください。例えば

// simple recursion
size_t mystrlen1(const char* str)
{
  return (*str) ? 1 + mystrlen1(++str) : 0;
}

また

// iteration
size_t mystrlen_iteration(const char* str)
{
  size_t counter = 0;
  for (;*str!=0; ++str) ++counter;
  return counter; 
}
于 2013-02-26T23:22:30.930 に答える
1

sizeof(char *) は、文字列へのポインタのサイズです。あなたが試すことができます

char foo[] = "foobar";

sizeof(foo) = 7 (「foobar\0」であるため - null で終わる文字列)

于 2013-02-26T23:32:29.803 に答える
0

取得している値が表示される理由は明らかです。

fooはポインターであり、ポインターの長さはほとんどの場合 4 バイトです。*foochar で、長さは 1 バイトです。組み込みのライブラリを使用できない場合は、独自のライブラリを作成できます。

function myStrlen(char* foo) {
    int ii=0;
    while(foo[ii]!='\0') ii++;
    return ii;
}

私は、ほとんどのコンパイラが (pointer - 1) に値を格納することによって、割り当てられたメモリのブロックのサイズを記録するという面白い考えを持っています - これは free() が解放するメモリの量を知る方法です。これが普遍的に当てはまるかどうか、文字列定数に当てはまるかどうかはわかりませんが、過去にこれをうまく使用しました。はい、私はハッカーです...あなたの場合、私は慎重にのぞき見します

*(((unsigned long int*)foo) - 1)

そこに文字列の長さが見つかったとしても、私は驚かないでしょう。

于 2013-02-26T23:27:48.803 に答える
-1

使用std::string:

#include <string>

int main()
{
    std::string str("Hello World");

    std::cout << str.length(); // 11
}
于 2013-02-26T23:30:07.170 に答える