-11

我有以下函数计算句子中的字符数

// A function to get a length of any sentence.
int length(char *str){
    int size = 0;
    while(str[size] != '\0'){
    size++;
    }
  return size;
}


int main(){
    char *name = new char;
    int cnt = 0;
    cin.getline(name, length(name));

    cout << length(name) << endl;

  return 0;
}

但是当输入一个句子并得到它的长度时,我发现句子的长度只有 2 个字符。

为什么会这样?

4

3 回答 3

4

这个:

char *name = new char;

为一个字符分配空间。

你宁愿想要类似的东西

char buf[0x100];
cin.getline(buf, sizeof(buf));

反而。(您实际上并不需要动态内存分配,而且逻辑有缺陷 - 您事先不知道输入的长度,因此length(name)作为 的参数没有意义cin::getline()。)

啊,还有通常的警告:为什么不std::string呢?

std::string str;
std::getline(std::cin, str);
于 2013-07-19T04:47:36.400 回答
4

问题在于:

char *name = new char;

您只分配 1 char,如果您想在其中存储大于 1 个字符的内容(更不用说您需要另一个用于空终止符),这还不够。

而是尝试这样的事情:

char* name = new char[64];  // Be careful. Storing more than 64 characters will lead you to more or less the same error
cin.getline(name, 64);
...
delete[] name;  // Be sure to delete[] name

更好的:

char name[64]; // Again, be careful to not store more than 64 characters
cin.getline(name, 64);
...

最好的:

std::string name;  // The sane way to use strings
std::getline(std::cin, name);


更新: 如果要使用 获取字符串的长度std::string,可以使用std::string::size()

std::cout << name.size() << std::endl;
于 2013-07-19T04:51:19.660 回答
0

当您调用length并开始阅读“随机”内存位置时,您从 main 的第 3 行开始“处于未定义行为的领域”。这可能是你的意思

#include <iostream>

using namespace std;

int main(){
    char name[100];
    cin.getline(name, sizeof name );

    cout << sizeof name << ": " << name << endl;

  return 0;
}
于 2013-07-19T04:52:46.523 回答