2014-04-23 56 views
1

我已经阅读了关于我的问题的所有以前的答案。但是,我不是一个非常明亮的编码器,无法把握它。有人可以看看我的问题。给字符数组赋予char字符串的问题

我正在尝试使用二维数组中的条目编写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

你写str1 =每一次,你告诉编译器来改变str1,使其指向内存的任何位置在右侧找到=标志的一侧。但是你声明char str1[100],这意味着str1被解释为一个指针,只能指向该声明分配它们的位置处的100个字符块的开始。所以写str1 =是没有意义的。

传递一个C字符串常量作为第一个参数strcat很可能是一场灾难,尽管编译器似乎不介意。 strcat的第一个参数应该是一个足够大的字符缓冲区以保存并置结果。为了将某些东西连接到常量字符串的末尾,可以分配足够大的缓冲区,然后将常量字符串复制到它,然后调用strcat

一般来说,你大概可以做任何你需要不使用的strcat返回值做的,那就是,没必要永远写strcat上的=的右侧。

建议您使用fgets而不是gets,因为这样您就可以防止可能会得到太多的输入以适应分配的字符缓冲区。如果您在最大缓冲区中分配了100个字符,则只能接受95个字符减去字符串"C:\\Users\\Neil\\Documents\\Trust CSV Logs\\"的长度。 (其他5个字符需要保存字符串".csv"和终止空字符)。

我还看到你声明str2str3但我没有看到你在哪里使用他们。看起来你不需要这两个字符串,但是你可能会发现使用str2作为最后一个字符串连接的缓冲区很方便。