如何在动态数组c ++中查找字符数

时间:2016-02-05 07:21:09

标签: c++ arrays

我是C ++的初学者,在过去的6个小时里我一直试图弄清楚如何获得动态数组中的字符数。 这是我的代码:

using namespace std;

int array_size;
typedef char* charPtr;
charPtr a = new char[array_size];
char *p=a;

int len(char p[]) {
int count = 0;
while (*p != '\0'); {
    count++;
    p++;
    return count;
    }
}

int main() {

    cout << "Type a phrase" << endl;
    cin >> array_size;
    cout << "Your phrase was " << len(p) << " characters long." << endl;

    return 0;
}

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

您必须在while循环的终止条件后删除分号(;)。 ;是声明的结尾,之后会有新的声明开始。除此之外,您的return语句将位于while循环内。将它移到循环外面。像这样调整你的代码:

int len(char p[]) {
    int count = 0;
    while (*p != '\0')
    {
        count++;
        p++;
    }
    return count;
}

此外,您必须将输入中的字符串读入动态分配的char数组:

int main() {

    int array_size = 100;
    char *p=new char[array_size];      // allocate memory

    cout << "Type a phrase" << endl;
    cin >> p;                          // read string into allocated memory

    cout << "Your phrase was " << len(p) << " characters long." << endl;

    delete p;                          // free memory
    return 0; 
}

函数strlen为您提供\0 - 终止字符串的长度。

#include <string.h>

int main() {

    int array_size = 100;
    char *p=new char[array_size];     // allocate memory

    cout << "Type a phrase" << endl;
    cin >> p;                         // read string into allocated memory

    cout << "Your phrase was " << strlen(p) << " characters long." << endl;

    delete p;                         // free memory
    return 0; 
}

但我建议使用std::string

#include <string>

int main() {

    std::string str;
    cout << "Type a phrase" << endl;
    cin >> str;

    cout << "Your phrase was " << str.size() << " characters long." << endl;
    return 0; 
}

std::string表示具有动态长度的字符序列。

答案 1 :(得分:1)

获取动态分配数组的大小

动态分配的数组没有任何有关其大小的信息,这些信息以符合标准的方式提供。

我们能够计算C样式字符串的长度,因为有标记元素'\0'来标记字符串的结尾。其他类型没有这样的元素。

即使这样,你也无法计算使用堆内存分配的字符数组的大小。

发布代码的问题

  1. 您在所有功能之外都有以下行。

    int array_size;
    typedef char* charPtr;
    charPtr a = new char[array_size];
    char *p=a;
    

    main执行任何操作之前执行它们。执行这些行后,array_size会初始化为0。然后使用charPtr作为0的值为array_size分配内存。

  2. 由于拼写错误导致函数len出错,这可能导致(a)挂起程序或错误的返回值。

    int len(char p[])
    {
       int count = 0;
    
       while (*p != '\0');
                   //   ^^^ The semicolon is a problem
       {
          count++;
          p++;
          return count;
       }
    }
    

    如果*p不等于'\0',程序将永远不会退出while语句。它会变的。

    如果*p等于'\0',程序将退出while语句,但之后仍会执行这些行。因此,您最终会返回1作为0是正确答案的长度。

  3. main中,您有:

    cout << "Type a phrase" << endl;
    cin >> array_size;
    

    当用户看到输出时,他们会尝试输入短语。但是,array_sizeint。提示用户和读取数据的行不匹配。

    您可以将它们更改为:

    cout << "Type array size" << endl;
    cin >> array_size;
    cout << "Type a phrase" << endl;
    

    这是更好的一步,但仍然没有改变使用a大小分配0的内存的事实。

  4. 使用未初始化的内存

    您在len(p)行中呼叫cout,但p的元素尚未初始化。

  5. 从你的帖子中不清楚该程序应该做什么。我猜您想要阅读stdin中的短语并将其写入stdout。您可以使用以下简化版本。

    int main() 
    {
       std::string phrase;
       cout << "Type a phrase" << endl;
    
       // Get the entire line as a phrase.
       std::getline(std::cin, phrase);
    
       cout << "Your phrase is " << phrase << endl;
       cout << "It is " << phrase.size() << " characters long." << endl;
    
       return 0;
    }
    

答案 2 :(得分:0)

第一个问题:在初始化之前你不能使用array_size。

  

char* a = new char [array_size]

由于array_size尚未初始化并且其中包含垃圾数据,因此您不知道该数组的大小。

这就是为什么首先必须初始化array_size,然后才分配char array

int array_size = 0 //no reason to have this variable as global, but that's up to you 
char *a = nullptr; //same

int main()
{
    cin >> array_size;

    if (array_size <= 0) //make sure the input is valid and not negative
         return 0;       

    a = new char[array_size];

    //now you can work on your newly allocated array of characters

    //the number of characters the array has equals to the array_size variable.

    delete[] a;
    return 0;
}

你的len函数检查'\ 0'字符,但同样,你还没有初始化那个char数组,所以它包含垃圾数据。因此,有时你可能得到len 5,10,502043的结果,任何事情都可能发生(未定义的行为)。