我的节目是
#include <iostream>
char * grabNumber ( char * begin )
{
// Interpret *begin as the start of a double and add the characters to a
// string retstr
char * begincpy = begin;
int foundDot = 0;
while ((*begin >= '0' && *begin <= '9') || *begin == '.')
{
if (*begin == '.')
{
if (foundDot == 0) foundDot = 1;
else break;
}
++begin;
}
long n = begin - begincpy; // # of characters parsed
char * retstr = malloc(sizeof(char) * (n + 1)); // string to be returned
for (long k = 0; k < n; ++k) retstr[k] = *begincpy++;
retstr[n] = '\0';
return retstr;
}
int main()
{
char str [] = "abc3.14def";
std::cout << grabNumber(str+3); // should print "3.14"
return 0;
}
我得到的错误是
第20行:警告:内置的不兼容的隐式声明 函数'malloc'第21行:错误:'for'循环初始声明使用 在C99模式之外
对应2行
char * retstr = malloc(sizeof(char) * (n + 1)); // string to be returned
for (long k = 0; k < n; ++k) retstr[k] = *begincpy++;
请参阅:http://codepad.org/c2tNGFEo
另外,有没有办法可以减少算法的冗余,因为它在.
循环的每次迭代中检查while
两次,但我不能如果我们遇到第二个.
答案 0 :(得分:2)
我猜你正在尝试编写C ++,因为你已经包含了iostream
并使用了std::cout
。但是,错误消息显示您正在使用C编译器。我猜也是你写的gcc myprogram.c
。要获得C ++编译,您需要编写g++
而不是gcc
,或者将文件重命名为.cc
扩展名。 (最好是两者)。
要使用malloc
,您需要#include <cstdlib>
。
此后您可能需要using namespace std;
或using std::malloc;
;并且您需要转换malloc
返回的值,因为C ++不会隐式地从void *
转换为其他指针类型。
然而,malloc
在C ++中很少使用,因为它没有正确初始化非平凡对象。请考虑将此代码更改为:
char * retstr = new char[n+1];
然后你不需要任何额外的包括。
但是这仍然是一个弱设计,因为你现在依靠调用者来释放内存。实际上,您的main
函数存在内存泄漏,因为它不会释放内存。
在C ++中,拥有由知道内存管理的容器类管理的内存是更好的方式;所以程序员不能犯任何错误。 (如果你想知道,这通常不会引入任何低效率,甚至可能加快速度。)
更好的方法是#include <string>
,使函数返回std::string
,并将函数的最后五行更改为:
return { begincpy, begin };
或者如果使用pre-C ++ 11编译器,
return std::string(begincpy, begin);
答案 1 :(得分:1)
让我们首先观察你没有写C,你正在编写C ++。您应该修复编译/项目设置,以便使用C ++编译器而不是C编译器编译文件。这也将修复关于for
循环的编译错误,因为这在C-99之前的C中无效。
其次,第一个警告实际上是由于缺少include
。在C语言中,你需要#include <stdlib.h>
在C ++中#include <cstdlib>
从C标准库中获取定义。