我是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);
}
請建議
我是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);
}
請建議
不能修改字符串字面那樣,根據標準它是未定義的。您正在嘗試用其他數據覆蓋該字符串文字(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);
這是一個辦法做到這一點,還有其他的。
您的「名稱」字符串沒有足夠長的時間來容納您使用sprintf打印到的字符集 - 您需要爲所有字符分配足夠的緩衝區。
我不明白這個答案downvote。而寫入字符串文字是UB的事實肯定是一個問題,在這裏,John所指出的那個也是一個有效的問題。這方面只隱含在其他答案中。 –
非常感謝您的幫助! –
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";
...
我的問題是,我不知道字符串進來的大小,因此定義了一個指針 –
幾乎一個-1,用於提出'strcpy'而不是初始化... –
好,問題是緩衝區,而不是它是如何初始化,但你是對的,所以我編輯了。 –
您需要使用malloc /釋放calloc或將其定義爲固定長度的變量爲name
指針分配內存:char name[50]
(例如)
非常感謝您的幫助! –
正確在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);
}
非常感謝您的幫助! –
「int main(void)」或「int main(int argc,char ** argv)」或者您正在爲嵌入式設備編寫代碼。如果您正在編寫託管環境(例如,windows,linux,unix等),則不應使用「void main()」 –
在Linux和與GNU libc的系統,您還可以使用代碼asprintf
char* str = NULL; // pointer should be initialized to NULL
asprintf (&str, "someformat %d", 20);
使用GTK,你也可以撥打g_strdup_printf
您應該瞭解C中數組和指針之間的區別和相似之處。許多書或講座都詳細解釋了這些內容。
問候。
我的問題是保存文件的名稱(〜1000)。所有文件需要以完整的目錄路徑存儲。我不知道它如何適用於長目錄路徑。我可以根據directoryPath +文件名分配空間嗎?感謝您的寶貴建議 –
在C中,您不能分配一個字符串,名稱=「JAMES BOND」;你必須使用像strcpy,strcat或類似的功能。 –
感謝這有助於 –