2015-06-01 40 views
-1

我的計劃是不兼容的隱式聲明

#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; 
} 

和我得到的錯誤是

Line 20: warning: incompatible implicit declaration of built-in function 'malloc' Line 21: error: 'for' loop initial declaration used outside C99 mode

對應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

'std :: cout'在C中是非法的。這是否意味着C++的問題? –

+0

在這個網站上最好堅持每個問題一個問題。發佈一個關於算法效率的單獨問題,一旦你得到它的運行並給出正確的輸出。 –

+0

@MattMcNabb我現在已經運行並獲得正確的輸出 –

回答

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 *隱式轉換爲其他指針類型。

但是,在C++中很少使用malloc,因爲它不能正確初始化非平凡對象。考慮將此代碼更改爲:

char * retstr = new char[n+1]; 

那麼您將不需要任何額外的包含。


但是,這仍然是一個薄弱的設計,因爲你現在依靠調用者釋放內存。實際上你的main函數有內存泄漏,因爲它不釋放內存。

在C++中,更好的方式是由知道內存管理的容器類管理內存;所以程序員不能犯任何錯誤。 (Incase你想知道,這通常不會導致任何低效率,甚至可能加快速度)。

一個更好的辦法是#include <string>,使函數返回std::string,並改變你的函數的最後五行:

return { begincpy, begin }; 

,或者使用預先C++編譯器11,

return std::string(begincpy, begin); 
+0

在C++的情況下的好處,但是因爲我們的無畏程序員顯然試圖將代碼編譯爲C,需要先解決(!)。 (你可以通過關於C-99模式的錯誤信息來判斷,這是GCC會吐出的東西。) – user268396

+0

@ user268396很難說;可能是因爲他打算編寫C++並使用了錯誤的編譯器 –

+0

是的,那是需要修正的:他應該調用C++編譯器而不是C編譯器。否則,你的完美的C++修復程序中沒有一個會修復一個東西(!),因爲C編譯器不會在乎知道iostream或std :: string或重載的<<運算符是什麼。 – user268396

1

讓我們從觀察你不是在編寫C,而是在編寫C++開始。您應該修復編譯/項目設置,以便使用C++編譯器而不是C編譯器編譯文件。這將修復關於for循環的編譯錯誤,因爲在C-99之前在C中無效。

其次,第一個警告實際上是由於缺少include。在C語言中,你將使用C++中的#include <stdlib.h>,你會從#include <cstdlib>獲得C標準庫中的定義。