2011-10-21 34 views
1

我是C語言的新學習者。c程序轉unix上的核心

下面的程序在Windows上運行良好,但是當我在Solaris上用gcc編譯,這是傾銷的核心

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

void main() 
{ 
char *name; 
name="James Bond"; 
int i=0; 
sprintf(name,"%s/%d",name,i); 
printf("String is %s",name); 
} 

請建議

回答

6

不能修改字符串字面那樣,根據標準它是未定義的。您正在嘗試用其他數據覆蓋該字符串文字(sprintf)。

許多實現將它們放在只讀內存中,導致核心轉儲 - 它們是好的。壞的將繼續,好像一切都好,通常不是。

你可以嘗試以下方法:

#include <stdio.h> 

int main (void) { 
    char *name; 
    char name2[100]; // make sure plenty of space. 
    name = "James Bond"; 
    int i = 0; 
    sprintf (name2, "%s/%d", name, i); 
    printf ("String is %s\n", name2); 
    return 0; 
} 

大多數這種類型的問題,有這樣的代碼:

name = "Bob"; 
*name = 'J'; // to try and make "Job" 

但它只是爲未定義寫入使用sprintf以及字符串文字。


根據註釋,您希望能夠組合路徑和文件規範。你可以這樣做,就像這樣:

char *path = "/tmp/"; 
char *file = "xyz.txt" 
char fullpath = malloc (strlen (path) + strlen (file) + 1); 
if (fullpath == NULL) 
    // error and exit condition 
strcpy (fullpath, path); 
strcat (fullpath, file); 
// use fullpath for your nefarious purposes :-) 
free (fullpath); 

這是一個辦法做到這一點,還有其他的。

+0

我的問題是保存文件的名稱(〜1000)。所有文件需要以完整的目錄路徑存儲。我不知道它如何適用於長目錄路徑。我可以根據directoryPath +文件名分配空間嗎?感謝您的寶貴建議 –

+0

在C中,您不能分配一個字符串,名稱=「JAMES BOND」;你必須使用像strcpy,strcat或類似的功能。 –

+0

感謝這有助於 –

0

您的「名稱」字符串沒有足夠長的時間來容納您使用sprintf打印到的字符集 - 您需要爲所有字符分配足夠的緩衝區。

+0

我不明白這個答案downvote。而寫入字符串文字是UB的事實肯定是一個問題,在這裏,John所指出的那個也是一個有效的問題。這方面只隱含在其他答案中。 –

+0

非常感謝您的幫助! –

1
char *name; 
name="James Bond"; // name is pointing into read-only memory 
int i=0; 
sprintf(name,"%s/%d",name,i); // trying to write to read-only memory 
printf("String is %s",name); 

改用緩衝器

char name[32] = "James Bond"; 
... 
+0

我的問題是,我不知道字符串進來的大小,因此定義了一個指針 –

+0

幾乎一個-1,用於提出'strcpy'而不是初始化... –

+0

好,問題是緩衝區,而不是它是如何初始化,但你是對的,所以我編輯了。 –

0

您需要使用malloc /釋放calloc或將其定義爲固定長度的變量爲name指針分配內存:char name[50](例如)

+0

非常感謝您的幫助! –

1

正確在C中定義和初始化常量字符串的方法是

char name[]="James Bond"; 

您的代碼可能是這樣的:

#include<stdio.h> 
#include<stdlib.h> 
void main() 
{ 
    char name[] = "James Bond"; 
    int i = 0; 

     printf("String is %s/%d", name,i); 

} 
+0

非常感謝您的幫助! –

+0

「int main(void)」或「int main(int argc,char ** argv)」或者您正在爲嵌入式設備編寫代碼。如果您正在編寫託管環境(例如,windows,linux,unix等),則不應使用「void main()」 –

0

在Linux和與GNU libc的系統,您還可以使用代碼asprintf

char* str = NULL; // pointer should be initialized to NULL 
asprintf (&str, "someformat %d", 20); 

使用GTK,你也可以撥打g_strdup_printf

您應該瞭解C中數組和指針之間的區別和相似之處。許多書或講座都詳細解釋了這些內容。

問候。