我是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;
}
非常感谢任何帮助!
答案 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'
来标记字符串的结尾。其他类型没有这样的元素。
即使这样,你也无法计算使用堆内存分配的字符数组的大小。
发布代码的问题
您在所有功能之外都有以下行。
int array_size;
typedef char* charPtr;
charPtr a = new char[array_size];
char *p=a;
在main
执行任何操作之前执行它们。执行这些行后,array_size
会初始化为0
。然后使用charPtr
作为0
的值为array_size
分配内存。
由于拼写错误导致函数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
是正确答案的长度。
在main
中,您有:
cout << "Type a phrase" << endl;
cin >> array_size;
当用户看到输出时,他们会尝试输入短语。但是,array_size
是int
。提示用户和读取数据的行不匹配。
您可以将它们更改为:
cout << "Type array size" << endl;
cin >> array_size;
cout << "Type a phrase" << endl;
这是更好的一步,但仍然没有改变使用a
大小分配0
的内存的事实。
使用未初始化的内存
您在len(p)
行中呼叫cout
,但p
的元素尚未初始化。
从你的帖子中不清楚该程序应该做什么。我猜您想要阅读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的结果,任何事情都可能发生(未定义的行为)。