我是C语言的新学习者。
下面的程序在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);
}
请建议
答案 0 :(得分: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
写入字符串文字。
根据评论,您希望能够对路径和文件规范进行tocombine。你可以这样做:
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);
这是一种方式,还有其他方式。
答案 1 :(得分: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";
...
答案 2 :(得分: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);
}
答案 3 :(得分:0)
您的“名称”字符串不足以保存您使用sprintf打印的字符集 - 您需要为所有字符分配足够的缓冲区。
答案 4 :(得分:0)
您需要使用malloc / calloc为name
指针分配内存或将其定义为固定长度变量:char name[50]
(例如)
答案 5 :(得分:0)
在Linux和使用GNU Libc的系统上,您也可以使用 asprintf 进行编码
char* str = NULL; // pointer should be initialized to NULL
asprintf (&str, "someformat %d", 20);
使用GTK时,您也可以调用g_strdup_printf
你应该理解C中数组和指针之间的差异和相似之处。许多书籍或讲座都详细解释了这一点。
问候。