2013-04-18 64 views
1

我是C新手,正在嘗試在程序運行之前定義輸出文件名。我得到一個總線錯誤 這裏是我的代碼:使用C中的用戶定義名稱編寫輸出文件

#include <stdio.h> 

int main (int argc, const char * argv[]) { 
    char fname[128]; 
    printf("Enter the file name\n"); 
    scanf("%123s",fname); 
    strcat("/Users/user/Desktop/learn/", fname); 
    strcat(fname, ".txt"); 

    FILE *fp; 
    fp=fopen(fname,"a"); 
    fprintf(fp, "Testing... OK I think it worked\n"); 
    return 0; 
} 
+1

您的'main()'簽名是錯誤的。 – 2013-04-18 21:31:04

+2

對於同樣是新手語言的新成員來說,這是相當苛刻的對待。這不像他要求你做他的作業什麼的。對於一個隱含的問題,這是一個有效的問題,我們經驗豐富的人應該能夠回答並給出一些指導,說明他如何能夠更好地提出問題以及如何學習語言。 –

回答

1

您正在使用一個字符串作爲第一次調用strcat的目標指針。所以你可以通過fname連接「/ Users/user/Desktop/learn /」並將結果存儲在永遠存儲在「/ Users/user/Desktop/learn /」中的地方,甚至可能不可寫。

+0

我意識到這有很多錯誤,但感謝您的意見。我正在參加的這門課有我們向前邁進,期望熟悉C – Davis

3
  1. 您沒有#include <string.h>對於strcat
  2. strcat的第一個參數必須是一個指針,而不是字符串文字。
  3. strcat本身不安全,請使用strncat代替。
  4. 不要忘記檢查scanffopen的結果。
  5. 並且當你完成它時關閉fp
  6. main的簽名應該是int main(int argc, char * argv[])

採用scanf一般也氣餒,使用fscanf & sscanf代替。

0

這不是strcat()的工作方式。

我看到兩種方法:

  • 使用fname正確,與文件名一起輸入:

    char fname[128]; 
    strcpy(fname, "/Users/user/Desktop/learn/"); // ok as long as you don't make the 128 too small 
    char * input = fname + strlen(fname); // now points after the final/
    printf("Enter the file name\n"); 
    scanf("%123s", input); // the 123 is probably not correct 
    strncat(fname, ".txt", sizeof fname); 
    

    ,並使用它。

    目前,這種方法仍然受到輸入限制爲123字節這一事實的影響,這可能太大,所以現在最好忘記它。這只是爲了得到這個想法。

    也許fgets()可能會更好:

    fgets(input, sizeof(fname)-strlen(fname), stdin); 
    
  • 使用命令行參數,這將是我最喜歡的辦法:

    // first check if argc is >= 2, i. e. if the caller has supplied an argument 
    char fname[128]; 
    strcpy(fname, "/Users/user/Desktop/learn/"); 
    strncat(fname, argv[1], sizeof fname); 
    strncat(fname, ".txt", sizeof fname); 
    
+0

謝謝!第一種方法奏效。在嘗試使用命令行參數之前,我需要做的更好。 – Davis

+0

@Davis在這種情況下,「使用命令行參數變得更好」是什麼意思?這聽起來像是一件大事 - 事實並非如此。 – glglgl

+0

這是一個家庭作業的任務,所以我使用了第一種方法,第二種方法需要更多關於c的知識,我還沒有。 – Davis

0

試試這個,這是爲我工作..

http://cboard.cprogramming.com/c-programming/124576-whats-mean-char*-const*-argv.html

#include <stdio.h> 
#include <string.h> 
int main (int argc, const char*const* argv[]) 
{ 

char fname[128]; 
char path[] = "/home/abc/test/"; 
printf("Enter the file name\n"); 
scanf("%123s",fname); 
strcat(fname,".txt"); 
strcat(path,fname); 
FILE *fp; 
fp=fopen(path,"a");  
fprintf(fp, "Testing... OK I think it worked\n"); 
fclose(fp);  
return 0; 
} 
-1

感謝大家的意見。這是工作代碼:

#include <stdio.h> 
#include <string.h> 
int main (int argc, const char*const* argv[]) 
{ 
char fname[128]; 
strcpy(fname, "/Users/user/Desktop/learn/"); 
char * input = fname + strlen(fname); 
printf("Enter the file name\n"); 
scanf("%s", input); 
strncat(fname, ".txt", sizeof fname); 
printf("The output pathway and file will be called %s\n", fname); 
FILE *fp; 
fp=fopen(fname,"a");  
fprintf(fp, "Testing... OK I think it worked\n"); 
fclose(fp);  
return 0; 
} 
+0

如果輸入長路徑名稱,則會發生intresting事件。應該記錄後驗,這可能在幸運的情況下工作,但確實使用scanf()(從不這樣做!),並且不正確地使用strncat()的最後一個參數。它也不會在fopen()之後檢查strncat之後的錯誤。壞。 –

相關問題