使用strcpy存储包含许多变量的字符串

时间:2014-07-22 16:48:54

标签: c string printf strcpy

我不确定如何说出来,所以标题可能不清楚。这是有问题的一行

strcpy (stringstore,"int1: %d\nint2: %d\nint3: %d\nint4: %d\nstring1: %s\nstring2: %s\n",int1,int2,int3,int4,string1,string2);

这是在for循环中,因此int和字符串的值正在改变。我想将每个字符串存储在stringstore中。我怎么能这样做?

编辑:这是更多代码。

int id;
int year;
char title[30];
char director[30];
double price;
double length;
int i;
char stringstore[300];
FILE *outp;
outp= fopen("CurrentCatalog.txt","w");
for (i = 0;i<=*size;i++)
{
    id = entry[i].id;
    year = entry[i].year;
    strcpy(title,entry[i].title);
    strcpy(director,entry[i].director);
    price = entry[i].price;
    length = entry[i].length;
    fprintf(outp,"ID: %d\nTitle: %s\nDirector: %s\nYear: %d\nPrice: %.2f\nLength: %.2f\n",id,title,director,year,price,length);
}
fclose(outp);

3 个答案:

答案 0 :(得分:1)

始终首选snprintf将任何数据转换为字符串。 sprintfsnprintf

的原型
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);

在代码中进行以下更改

snprintf(stringstore,sizeof(stringstore),"int1: %d\nint2: %d\nint3: %d\nint4: %d\nstring1: %s\nstring2: %s\n",int1,int2,int3,int4,string1,string2);

答案 1 :(得分:0)

是的,你可以做到。您要查找的功能是sprintf()而不是strcpy()。 它的语法相同。

sprintf(stringstore,"int1: %d\nint2: %d\nint3: %d\nint4: %d\nstring1: %s\nstring2: %s\n",int1,int2,int3,int4,string1,string2);

编辑:正如@chris建议的更安全的方法是使用snprintf()

char stringstore[500];
snprintf(stringstore, 500, "int1: %d\nint2: %d\nint3: %d\nint4: %d\nstring1: %s\nstring2: %s\n",int1,int2,int3,int4,string1,string2);

EDIT2 根据您在上面发布的新代码,我建议您合并sprintffprintf

fprintf(outp,"ID: %d\nTitle: %s\nDirector: %s\nYear: %d\nPrice: %.2f\nLength: %.2f\n",id,title,director,year,price,length);

答案 2 :(得分:0)

关于 ...使用 * strcpy()* 来存储包含许多变量的字符串......

简短的回答是,你不是。请改用sprintf()(或其中一个变体)。 (见下文)

我想将每个字符串存储在stringstore中。我怎么能这样做? 如果要存储每个新数据集,而不是在循环的迭代中丢失它,则需要使stringstore成为一个字符串数组。即创建它:

char **stringstore = 0;//will provide for an array of strings when memory is allocated

然后为它分配内存。

编辑 :(根据您的评论)

如果您不需要保留以前的信息,那么足够长度的单个字符串(char数组)将起作用:

#define MAX_LEN 280;//arbitrary size choice as you have not specified size in your code
char *stringstore = 0;  
stringstore = malloc(MAX_LEN +1);// +1 for null terminator  

然后 您可以将信息放入字符串存储中,如下所示:

sprintf(stringstore,"int1: %d\nint2: %d\nint3: %d\nint4: %d\nstring1: %s\nstring2: %s\n",int1,int2,int3,int4,string1,string2);    

使用此方法将stringstore的内存放入堆而不是堆栈,因此在使用它时需要释放它。

free(stringstore);  

<强> 注意:
您可能还需要询问有关代码的其他问题,例如 打开文本文件后,如何将数据读入我的变量? (您打开文本文件,然后进入循环,但有 永远不要从文件中读取数据来填充循环中使用的变量。)