我不确定如何说出来,所以标题可能不清楚。这是有问题的一行
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);
答案 0 :(得分:1)
始终首选snprintf
将任何数据转换为字符串。 sprintf
和snprintf
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 根据您在上面发布的新代码,我建议您合并sprintf
和fprintf
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);
<强> 注意:的强>
您可能还需要询问有关代码的其他问题,例如
打开文本文件后,如何将数据读入我的变量?
(您打开文本文件,然后进入循环,但有
永远不要从文件中读取数据来填充循环中使用的变量。)