我已经阅读了有关我的问题的所有先前答案。但是,我不是一个非常聪明的编码器,无法掌握它。有人可以调查一下我的问题。
我正在尝试使用2D数组中的条目来编写CSV文件。 string.h已经包含在main()中。
void create_marks_csv(int rout[][20],float p[][20],float c[][20],int n)
{
system("cls");
char str1[100],str2[100],str3[100];
printf("\nEnter filename for routing matrix: ");
gets(str1);
printf("\n Creating %s.csv file",str1);
FILE *fp;
int i,j;
str1=strcat(str1,".csv");
str1=strcat("C:\\Users\\Neil\\Documents\\Trust CSV Logs\\",str1) ;
fp=fopen(str1,"w+");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j)
fprintf(fp,"X");
else
fprintf(fp,"%d",rout[i][j]);
}
fprintf(fp,"\n");
}
fclose(fp);
printf("\nFile created: %s",str1);
system("cls");
}
警告和错误如下:
5 20 C:\Users\Neil\Documents\main.c [Warning] extra tokens at end of #include directive [enabled by default]
C:\Users\Neil\Documents\main.c In function 'create_marks_csv':
168 6 C:\Users\Neil\Documents\main.c [Error] incompatible types when assigning to type 'char[100]' from type 'char *'
169 6 C:\Users\Neil\Documents\main.c [Error] incompatible types when assigning to type 'char[100]' from type 'char *'
28 C:\Users\Neil\Documents\Makefile.win recipe for target 'main.o' failed
答案 0 :(得分:0)
每次编写str1 =
时,都告诉编译器更改str1
,使其指向=
符号右侧的内存中的任何位置。但是您声明了char str1[100]
,这意味着str1
被解释为指针,只能指向此声明分配它们的位置处的100个字符的块的开头。所以写str1 =
是没有意义的。
传递C字符串常量作为strcat
的第一个参数可能是一场灾难,尽管编译器似乎并不介意。 strcat
的第一个参数应该是一个足以容纳串联结果的字符缓冲区。为了将某些内容连接到常量字符串的末尾,您可以分配足够大的缓冲区,然后将常量字符串复制到它,然后调用strcat
。
一般情况下,您可以在不使用strcat
的返回值的情况下做任何您需要做的事情,也就是说,无需在{{1}的右侧写strcat
}。
建议使用=
而不是fgets
,因为这可以防止您获得太多输入以适应您分配的字符缓冲区的可能性。如果在最大缓冲区中分配100个字符,则只能接受95个字符减去字符串gets
的长度。 (其他5个字符用于保存字符串"C:\\Users\\Neil\\Documents\\Trust CSV Logs\\"
和终止空字符)。
我还看到你宣布".csv"
和str2
,但我没有看到你在哪里使用过它们。看起来你不需要它们,但你可能会发现使用str3
作为上一串字符串的缓冲区很方便。