2014-03-02 32 views
-2

我有一個問題,不要編譯此代碼,但要執行此程序。當我在終端運行它打印第一個2 cout然後程序停止工作,並在窗口上的屏幕告訴你,我認爲問題是strcat。 我正在使用DEVC++,我有Windows 7專業版。程序停止工作通過strcat()與指針

#include <iostream> 
#include <string> 
#include <cstdlib> 
#include <string.h> 

using namespace std; 

int main() { 

    char* cambia[] = {"ciao "}; 
    char* c[] = {"mondo"}; 

    cout << "*c: " << *c << endl; 
    cout << "*cambia: " << *cambia << endl; 

    strcat(*cambia, *c); 
    cout << "*cambia: " << *cambia << endl; 
} 
+0

你讀過'strcat'的文檔? – blackbird

+0

不使用devC++,它很古老。 – stefan

+0

你沒有足夠的空間來保存'strcat()'的結果''cambia'也是錯誤的。試試s.th.像'char cambia [100] =「ciao」;''和'strcat(cambia,* c);'。 –

回答

2

你不是在C使用strcat() ++,如果你不絕對必須(如維護舊代碼時和觸摸儘可能少的東西越好)。

使用std::string及其成員的功能,如findsubstr簡單的任務,string streamsBoost libraries用於更復雜的字符串分割。

無論如何,遠離strcat()

1

這裏的問題是您正在嘗試寫入只讀字符串存儲。

這些聲明:

char* cambia[] = {"ciao "}; 
char* c[] = {"mondo"}; 

聲明兩個陣列,每個具有字符串常量構件"ciao ""mondo"位於只讀存儲器中。

因此,當您撥打strcat(*cambia, *c)時,您正試圖將"mondo"寫入"ciao "的末尾。這不僅會寫入只讀內存,而且會寫入字符串的內存空間之外 - "ciao "字符串中只有空間用於存儲空間,您正嘗試在該空間添加另一個5。

解決方法是爲每個字符串保留一些空間。有多種方法可以做到這一點。這裏有一個簡單的一個:

char acambia[20] = "ciao ";  // Space for 20 characters. 
char* cambia[] = { acambia }; 

coruse中,不使用間接的額外水平將使其更簡單:

char cambia[20] = "ciao "; 
char c[] = "mondo"; 

strcat(cambia, c); 

將達到正確的結果。

1

方法strcat()將字符串從第二個參數添加到緩衝區,您將其提交給第一個參數。

首先,緩衝區必須是可寫的。在你的例子中,你傳遞一個字符串文字作爲緩衝區。當然,字符串文字是隻讀的。但即使如此,字符串文字也沒有可以添加新字符串的空餘空間。

而不是修復你的代碼,讓我告訴你一些正確的例子,如何在C++和C中連接字符串。

這個例子向您展示如何Concat的兩個C++字符串:

#include <iostream> 
#include <string> 

int main(int argc, const char * argv[]) 
{ 
    // Create a new C++ string with an initial text. 
    std::string result = "First string part "; 
    std::cout << "Result: " << result << std::endl; 

    // Add some text 
    std::string textToAppend = "and the second part"; 
    result.append(textToAppend); 
    std::cout << "Result: " << result << std::endl; 

    return 0; 
} 

下面的例子向您展示如何Concat的兩個字符串在C:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


int main(int argc, const char * argv[]) 
{ 
    // The two texts to concat 
    const char *firstText = "This is the first text "; 
    const char *secondText = "and this is the second one"; 

    // A buffer which is large enough for the operation. 
    const int bufferSize = 1024; 
    char buffer[bufferSize]; 

    // Copy the initial text into the buffer. 
    strncpy(buffer, firstText, bufferSize); 

    // Add the secon string 
    strncat(buffer, secondText, bufferSize-strlen(buffer)); 

    // Output the string 
    printf("Result: %s\n", buffer); 

    return 0; 
} 

我建議,你應該使用C++字符串如果可能的話。它們自動管理內存,防止與C字符串有關的許多內存相關問題。

1

此行

char* cambia[] = {"ciao "}; 

創建一個名爲cambia在存儲器的動態創建的部分可變的,被稱爲「棧」。該變量是一個沒有聲明大小的數組,該數組的元素是指向字符的指針。

數組的大小從初始化

{"ciao "} 

這意味着該陣列將僅具有一個元素遵循,那元件與值在串"ciao "的第一個字符指向初始化。但是,字符串"ciao "被放置在一些完全不同的內存區域中 - 它處於靜態塊中,由編譯器初始化,其值可在程序代碼中找到。編譯器不知道你如何使用這些值,特別是它不知道你將擴展爲它與strcat,所以它不會在字符串之後保留任何額外的空間。

當您連接到"mondo"一個"ciao "結果,您覆蓋在內存中的一些數據,可能還有一些重要的數據...

我建議你聲明當地變量的字符串,明確大小:

char cambia[ 20] = "ciao "; 
char c[] = "mondo"; 

這將使cambia變量足夠長的時間,以保持19個字符的字符串(加上隱含結束零字節「\ 0」,ASCII NUL)和初始化其前6個字節與樂t'c','i','a','o',空格'和NUL。變量c隱含地大小爲6(初始化字符串長度5加1用於終止NUL)。

然後你就可以放心地串聯

strcat(cambia, c); 

獲得11個字符的字符串 「僑盟」,並打印出來

cout <<"cambia: "<<cambia<<endl; 
0

首先,你不用頭

#include <string> 
#include <cstdlib> 

,因爲它們都不使用聲明。

ASLO頭

#include <string.h> 

應該被替換爲

#include <cstring> 

在這些語句

char* cambia[] = {"ciao "}; 
char* c[] = {"mondo"}; 

你定義兩個陣列它們中的每具有const char *類型的一個元件。編譯器應該發出錯誤或警告,因爲這些定義不正確。按照以下方式定義陣列將是正確的:

const char* cambia[] = {"ciao "}; 
const char* c[] = {"mondo"}; 

這兩個語句定義了數組的字符串常量指針。如果試圖更改程序中的字符串文字,這是未定義的行爲。允許程序將字符串文字放在只讀存儲器中。

你是正確的說,主要問題是在聲明中

strcat(*cambia, *c); 

功能strcat追加一個字符數組到另一個字符數組的結束。所以第二個cjaracter數組必須保留足夠的內存來容納附加的字符數組。如果你甚至會正確地定義陣列爲

char cambia[] = {"ciao "}; 

它沒有足夠的內存來存儲數組c的字符。 因此,在使用strcat之前,您需要預留足夠的內存來放置連接的結果數組。

例如,你可以做到這一點通過以下方式

char s[11]; 

strcpy(s, *cambia); 
strcat(s, c); 
cout << "s: " << s << endl; 

要考慮到的,而不是字符數組,你可以使用標準的類std::string

的對象在這種情況下,將一個字符串追加到另一個是做得很簡單。例如

std::string cambia = "ciao "; 
std::string c = "mondo"; 

cambia += c; 

或者

cambia.append(c);