2014-04-23 58 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作爲最後一個字符串連接的緩衝區很方便。