代码之家  ›  专栏  ›  技术社区  ›  Kevin Meredith

C++ SIZEOF(…)

  •  3
  • Kevin Meredith  · 技术社区  · 14 年前
    #include <cstdlib>
    #include <iostream>
    
    int main(int argc, char *argv[])
    {
       cout << "size of String " << sizeof(string );
    
       system("PAUSE");
       return EXIT_SUCCESS;
    }
    

    输出:

    字符串大小=4

    这是不是意味着,因为 sizeof(char) = 1 Byte (0 to 255) ,字符串只能保持 4 字符?

    9 回复  |  直到 14 年前
        1
  •  26
  •   Ori Pessach    14 年前

    从您的示例中不清楚“string”是什么。如果你有:

    #include <string>
    using namespace std;
    

    然后 string std::string sizeof(std::string) 给出类实例及其数据成员的大小,而不是字符串的长度。为此,请使用:

    string s;
    cout << s.size();
    
        2
  •  12
  •   Graham Perks    8 年前

    什么时候? string 定义为:

    char *string;
    

    sizeof(string) 告诉你指针的大小。4字节(你在32位机器上)你还没有分配内存来保存文本。你想要10个字符的字符串吗?字符串=malloc(10);现在字符串指向一个10字节的缓冲区,您可以将字符放入其中。

    sizeof(*string) 将是1。字符串所指向的大小,一个字符。

    如果你改了的话

    char string[10];
    

    尺寸(弦) 将是10。它是一个10个字符的数组。 尺寸(字符串) 还是1。

    这将是值得查找和理解的宏观计数。

    更新:哦,是的,现在包括标题:)“string”是一个实例占4字节的类,这就是所有的意思。这4个字节可以指向更有用的东西,例如存储超过4个字符的内存区。

    你可以这样做:

    string s = "12345";
    cout << "length of String " << s.length();
    
        3
  •  6
  •   Chubsdad    14 年前

    sizeof(char) 总是1字节。一 byte 我们认为是 8-bits need not be the case . 有一些体系结构,其中一个字节是32位、24位等等。这个 sizeof 应用于任何其他类型的是 SiZeOf(Car) 哪个是 by definition 1 .

    接下来要注意的是C++有三种字符类型: plain char, signed char and unsigned char . 一 plain char 要么是 signed unsigned . 所以假设char的值只能是0到255是错误的。只有当char为8位时才是这样,并且 普通炭 未签名的 .

    尽管如此,假设“字符串”是 'std::namespace' , sizeof(string) == 4 意味着 'std::string' 类是4个字节。它占用的字节数是 'char' 在那台机器上。 Note that signed T, unsigned T always have the same size . 这并不意味着字符的实际缓冲区(通常称为字符串)只有4个字节。里面 “STD::String” 类中,存在一个动态分配的非静态成员指针,用于保存输入缓冲区。这可以有与系统允许的元素一样多(C++对这个长度没有限制)。但自从 “STD::String” 类只保存指向此潜在的填充长度缓冲区的指针,sizeof(std::string)始终保持与给定体系结构上的sizeof指针相同,系统上的sizeof指针为4。

        4
  •  4
  •   JYelton Melchior Blausand    6 年前

    我知道有很多人回答了你的问题,但这里有一些要点:

    1. 它的大小不是 string 或字符串的容量,该值表示类的结构大小 一串 ,您可以通过它的实现(它可以从实现更改为实现)看到,这是一个简单的指针;
    2. 作为 sizeof(string) 是类结构的大小,您将得到唯一的内部指针的大小,在您的情况下是4个字节(因为您在32位机器中,这也可以从平台更改为平台);
    3. 这个指针在 一串 类,指向一个内存缓冲区,在该缓冲区中类将保存实际的字符串数据,该内存缓冲区将根据需要重新分配,它可以随着追加/删除/创建更多字符串文本而增加/减少;
    4. 如果要获得字符串的实际大小,需要调用 size() 方法,它将检查内存缓冲区字符串大小(与内存缓冲区大小不同)。

    我认为你的问题是你对 sizeof ,请参阅更多信息 here here 是关于它如何工作的一些解释。

        5
  •  2
  •   Scott Stafford    14 年前

    一点也不。这意味着类的结构是,它不包括它可以控制的动态内存。std::string将动态扩展以满足任何所需的大小。

    s.max_size() // will give the true maximum size
    s.capacity() // will tell you how much it can hold before resizing again
    s.size() // tells you how much it currently holds
    

    你从中得到的4个 sizeof 可能是某种指向更大结构的指针。尽管一些平台上的一些优化将使用它作为实际的字符串数据,直到它变大到不适合为止。

        6
  •  2
  •   Tom    14 年前

    不,这意味着类字符串的大小是4。

    这并不意味着字符串可以包含在4个字节的内存中。一点也不。但是你必须区别动态内存,用来包含 size 一个字符串可以组成的字符,以及这些字符中第一个字符的地址所占用的内存。

    试着这样看:

    contents  --------> |h|e|l|l|o| |w|o|r|ld|\0|
    

    sizeof 4是指内容占用的内存。它包含什么内容?只是一个指向char数组中第一个字符(地址)的指针。

    一个字符串可以包含多少个字符?理想情况下,内存中每字节有一个字符。

    一个字符串实际上有多少个字符?有一个成员函数被调用 size() 那就告诉你了

    size_type size() const
    

    看更多关于 SGI 页面!

        7
  •  0
  •   dan04    14 年前

    string 对象包含 指针 到包含实际字符串数据的堆上的缓冲区。(它也可以包含其他特定于实现的元信息,但显然您的元信息不包含。)所以您得到的是指针的大小,而不是它指向的数组的大小。

        8
  •  0
  •   user2808359    11 年前

    您还可以使用字符串,并可以通过string.length()函数找出其长度。请看下面的代码:

    // Finding length of a string in C++
    
    #include<iostream>
    #include<string>
    using namespace std;
    
    int count(string);
    
    int main()
    {
    string str;
    cout << "Enter a string: ";
    getline(cin,str);
    cout << "\nString: " << str << endl;
    cout << count(str) << endl;
    
    return 0;
    
    }
    
    int count(string s){
    if(s == "")
      return 0;
    if(s.length() == 1)
      return 1;
    else
        return (s.length());
    
    }
    

    您可以从以下位置获取详细信息: http://www.programmingtunes.com/finding-length-of-a-string-in-c/

        9
  •  -1
  •   Benjamin Mamistvalov    5 年前

    这对我很管用

    string StringToLower(string str)
    {
        string loweredStr = "";
    
        for (int i = 0; i < str.length(); i++)
        {
            if (str[i] >= 'A' && str[i] <= 'Z')
                loweredStr += (char)(str[i] + 32);
            else
                loweredStr += str[i];
        }
    
        return loweredStr;
    }