2011-08-19 95 views
1

我需要編寫一個程序,使用系統調用來讀取文件,反轉字符串並將其輸出到輸出文件。如果輸入文件是test.txt,則應將輸出寫入文件reverse_test.txt。請讓我知道如何將字符串reverse_附加到輸出文件的名稱,我將在其中編寫結果。將字符串附加到輸入文件名中c

我嘗試了下面的代碼,但它給出了錯誤。

strcat("reverse_",argv[1]); 

我寫了其餘的代碼,它工作正常,但無法解決這部分。

回答

1

strcat()標準庫函數接受兩個參數:目標和源字符串。

這意味着,當你嘗試這樣的事:

strcat("reverse_", argv[1]); 

你實際上是在說這樣的事情:

"reverse_" = "reverse_" + argv[ 1 ] 

..這是不正確的,因爲你不能修改(或至少,你不應該)字面上的「reverse_」。可以肯定的是,你將無法改變它的長度,因爲在這個過程中你會破壞代碼中的其他文字。

@cnicutar給你一個關於如何實現你正在尋找的結果提示,但如果你想堅持你關注這一進程,這裏的解釋是:

一)您需要在存儲器中保留一個地方,在其中存儲反轉的文件名。

b)你需要在那裏寫「reverse_」。

C)最後,你需要Concat的argv中的文件名[1]

的第一步是驚人的最困難的一年。需要多少空間?一個給定的文件名可以是最多255個字符:

http://en.wikipedia.org/wiki/NTFS

http://en.wikipedia.org/wiki/Ext4

......然而,沒有什麼可以阻止進入一個絕對或相對路徑的用戶。這意味着可能我們應該給出命令行可以處理的最大字符長度,這是......

http://support.microsoft.com/kb/830473

¡8192個字符!...這是無處領導我們。

一個更好的方法,導致最好的準確性,是計算argv [1]字符串中的字符數,然後添加前綴所需的字符,並將該數量加1,因爲我們還需要將標記存儲在字符串末尾:

const char * prefix = "reserve_"; 
int needed = strlen(argv[ 1 ]) + strlen(prefix) + 1; 

char store[ needed ]; 

strcpy(store, prefix);     // store <- prefix 
strcat(store, argv[ 1 ]);     // store <- store + argv[ 1 ] 

printf("%s\n", store); 

如果您不能使用這些類型的向量,則應該保留並使用動態內存。

const char * prefix = "reserve_"; 
int needed = strlen(argv[ 1 ]) + strlen(prefix) + 1; 

char * store = (char *) malloc(sizeof(char) * needed); 

strcpy(store, prefix);     // store <- prefix 
strcat(store, argv[ 1 ]);     // store <- store + argv[ 1 ] 

printf("%s\n", store); 
free(store); 

希望這會有所幫助。

+0

變量數組,僅限於C99。 – phoxis

+1

解決了由@phoxis指出的變量數組問題 – Baltasarq

+0

非常感謝。這工作像一個魅力。再次感謝 –

6

您不能附加到文字「reverse_」。嘗試是這樣的:

char str[ENOUGH] = {0}; 
snprintf(str, sizeof(str), "reverse_%s", argv[1]); 
+0

對不起,但我忘了提及,我將使用creat(2)系統調用來創建一個輸出將被寫入的新文件。使用creat(2)創建的文件的名稱必須是reverse_test.txt。以 –

+0

爲例:(fdw = creat(「outfile」,S_IREAD | S_IWRITE),這裏outfile應該是reverse_argv [1]。我是新手並完成了一些任務。可能無法高效地解釋 –

+1

問題是什麼你只是把這個'str'傳遞給'creat(2)' – glglgl

1
在你的榜樣「reverse_」

是一個字符串常量文字和要嘗試一些其他的內存位置追加到常量文字,這是不可能的。

你可以做到以下幾點:

char *buffer; 

buffer = malloc (sizeof (char) * BUFSIZ); 

strcpy (buffer, "reverse_"); 
strcat (buffer, argv[1]); 

/* Work here */ 

free (buffer); /* before termination */ 

或者你也可以定義緩衝與BUFSIZ長度的靜態數組。

+0

以前的解決方案工作,但感謝您提供這樣一個很好的方式來執行任務。提交作業後,我一定會試試這個。 –