2013-01-12 95 views
0

我在這裏還是新手,但是我遇到了問題,爲什麼我認爲下面的工作不能完成。你可以從2個字符串中分配一個字符串嗎?

我試圖將foobar賦值爲「Hello there!\ n」的值。要麼它不能完成,要麼我很難搞清楚。

編輯:我需要澄清,我正在尋找爲什麼以下不起作用,而不是許多解決方案中的其中一個可以採取它的地方。

編輯:我接受了「你不能在c中以這種方式連接字符串變量」的答案。據推測,因爲編寫解析器讓下面的方法太難了。我太新了,不知道有什麼不同,太新了,不太在意。如果有人發現引用的正式理由,請發佈。

#include <stdio.h> 

int main() 
{ 

char *foo = "Hello"; 
char *bar = " there!\n"; 
const char *foobar = (*foo) *bar; 

printf("%s", foobar); 

return 0; 

} 

這似乎不應該是一個問題。

+1

您正在尋找'snprintf(buffer,sizeof(buffer),「%s%s」,foo,bar)' – cnicutar

+1

不,你不能這樣做。 –

+0

@cnicutar:是的,這就是我一直在做的事情,但我從來沒有想過要先嚐試上述方法。我想了想,爲什麼不呢?我試圖做的是合乎邏輯的,似乎沒有害處。 – JustTired

回答

11

你不能以這種方式連接c中的字符串變量。

您需要一個內存空間,您將在該空間中複製該內存中的兩個字符串。

如果您已經知道您的字符串的大小不能大於定義的大小,則內存空間可能是一個靜態緩衝區,如char foobar[100]。或存儲可能是dynamiuc緩衝區,如果你不知道你的字符串的極限尺寸爲表明在下面的例子中

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

int main() 
{ 

    char *foo = "Hello"; 
    char *bar = " there!\n"; 
    char *foobar = malloc(strlen(foo) + strlen(bar) + 1); 
    strcpy(foobar,foo); 
    strcat(foobar,bar); 
    printf("%s", foobar); 

    return 0; 

} 

如果分配與malloc()的內存中,然後不要忘記釋放foobar內存whene之成爲在你的程序中無用

free(foobar); 
+0

+1,**這是一個正確的解決方案。 – 2013-01-12 20:31:42

+4

雖然,如果它包含相關的「免費」,它會很好...... –

+0

當然,我們可以使用100字節的緩衝區,而不是首先調用malloc。 –

3

在C中,字符串不能與你的方式連接。它模仿你正在嘗試做一種可能的方式是使用預處理器:

#include <stdio.h> 
#define FOO "foo" 
#define BAR "bar" 

int main() 
{ 
char *foo = FOO; 
char *bar = BAR; 
const char *foobar = FOO BAR; 

printf("%s", foobar); 

return 0; 
} 
+0

沒錯,但是當dmr或者誰在闡明字符串分配的工作方式時,導致他們不允許我發佈的內容? – JustTired

+0

我知道一些其他的語言做到這一點,但不是C.例如,在'bash'中,你可以這樣做:'foobar = $ foo $ bar',但不是C.'foo'和'bar'是指向字符串的指針,不會被C中的值替換。 –

2

接聽的「編輯」的問題:

它不起作用,因爲C語言本身卻毫不知情如何連接字符串。你應該使用strcat或其他一些功能。此外,編譯器不知道將字符串放在內存中的哪個位置,因此無法使用「foo」和「bar」存儲來存儲結果字符串。

當然,在C,的*foo在你的代碼的含義是字母'H',並*bar變成' '。因此(*foo) *bar變成('H') ' '這在C中絕對沒有任何意義。

+0

當然,你的意思是' * foo'變成'H','* bar'變成'(空格)'。 – user1055604

+0

是的,我正在看一個答案,其中有「富」和「酒吧」作爲字符串......修正,並澄清了一點。 –

+0

對,我明白了。但那甚至都不起作用。這只是語言本身的邏輯問題。我放棄尋找邏輯。它真的不值得麻煩,因爲它可以用其他方式工作。 – JustTired

1

您的代碼可能編譯時沒有問題,但在那裏可能會出現一些錯誤。

前兩個char *(或字符串)聲明是合法的。 第三個不是那麼多。 您正在將*(* bar)轉換爲* foo,它不是數據類型,而是一個變量,並且您將foobar設置爲foo的轉義值,而不是進行字符串連接。

C不會與運算符進行字符串連接。相反,您需要使用特定的庫來連接字符串或創建自己的函數。對於你有的字符串string.h

對於這種特殊情況,你有strcat:它需要兩個字符串,並返回一個新的字符串與這兩個字符串的連接。

所以,你的例子:

char *foo = "Hello"; 
char *bar = " there!\n"; 
const char *foobar = malloc((strlen(foo)+strlen(bar))*sizeof(char)); 
foobar = strcat(foo,bar); 

這樣的事情。

希望這會有所幫助。

+0

a)sizeof(char)是多餘的,因爲它總是評估爲1。 b)你不能像這樣使用strcat()。 foo不是有效的目的地。 –

相關問題