2016-05-06 16 views
-3

我要求用戶在這個計算機中插入一個文件地址,就像這個C:\ Users \ Rony \ Desktop \ file.txt做一些修改。我將這個地址保存在一個字符串中。因此,爲了進行更改,我希望將此字符串更改爲tmp.txt,因此地址將爲C:\ Users \ Rony \ Desktop \ tmp.txt。實際上,因爲計算機之間的地址不同,我想從最後刪除所有字符並添加到此tmp.txt中。但我不知道爲什麼我的代碼不工作 感謝您在我的一個練習中刪除了一定數量的字符

for (i = strlen(adress1); i > 0; i--) 
{ 
if (adress1[i] == "\\") 
    { 
    adress[i] = 0; 
    break; 
    } 
} 
+1

顯示你的一些努力。 – Marievi

+0

我沒有任何想法如何做到這一點,所以我問你,以幫助我 – Ronycohen

+1

歡迎來到stackoverflow.com。請花些時間閱讀[幫助頁面](http://stackoverflow.com/help),尤其是名爲[「我可以問些什麼話題?」]的章節(http://stackoverflow.com/help/)討論話題)和[「我應該避免問什麼類型的問題?」](http://stackoverflow.com/help/dont-ask)。另請[請閱讀如何提出好問題](http://stackoverflow.com/help/how-to-ask),並學習如何創建[最小,完整和可驗證示例](http:// stackoverflow .COM /幫助/ MCVE)。 –

回答

0

如果該文件的名稱是比新名稱較小重寫你的文件名可能會導致問題。即用戶選擇C:\a.txt,並且您想將其重命名爲C:\tmp.txt。這會導致錯誤,因爲數組綁定會被超出。因此你必須創建一個新的數組。下面的代碼有效,但看起來不太好。既然你不熟悉字符串函數,我認爲這可能是最好的方法。但我強烈建議查看這些提供的函數,以減少寫入的代碼量並提高可讀性。

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    char* p = "C:\\a.txt"; 
    int x; // this will hold the position of the last backslash 
    int i; 
    for(i = 0; p[i] != '\0'; i++){ 
     if(p[i] == '\\') { 
      x = i; 
     } 
    } 
    char pp[x+9]; 
    pp[x+8] = '\0'; 
    for(i = 0; i <= x; i++){ 
     pp[i] = p[i]; 
    } 
    pp[i+0] = 't'; 
    pp[i+1] = 'm'; 
    pp[i+2] = 'p'; 
    pp[i+3] = '.'; 
    pp[i+4] = 't'; 
    pp[i+5] = 'x'; 
    pp[i+6] = 't'; 

    printf("%s -> %s\n", p, pp); 
    return (0); 
} 

編輯

而不是做手工每次操作的,可以使用內置的library functions。使用這些將使代碼更短,更易於理解。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char *argv[]) { 
    char* p = "C:\\a.txt"; // the path 
    char* t = "tmp.txt"; // the new name of the file 
    char* e = strchr(p, '\\'); // returns a pointer to the last occurence of the backslash within the string p 
    int i = (int)(e-p); // i contains the index position of the last occurence of the backslash 
    char n[i+1+strlen(t)]; // create a string with max size i + 1 + length of t 
    strncpy(n, p, i+1);// copy the first (i+1) characters of p to n 
    strncpy(&n[i+1], t, strlen(t)+1); // copy the whole string t and \0 to the end of the new path 
    printf("%s -> %s\n", p, n); 
    return (0); 
} 
+0

OP對於基本的'string.h'函數可能並不熟悉,但是沒有理由不使用它們中的任何**。事實上,向他介紹正確的東西可能會有幫助。 – usr2564301

+0

@RadLexus感謝您的反饋。我使用內置函數添加了功能相同的代碼。 – jboockmann

1

要「刪除」 C字符串的一部分,所有你需要做的是設置你要保持一個0最後一個之後的字符。 (我在這裏說「刪除」(引用),因爲你實際上並沒有從內存中刪除任何東西;'字符串'變短了,但爲它分配的內存量保持不變,並且所有超出0的內容仍然可用。

有一個標準的string.h函數來定位最後一次出現的某個字符:strrchr。這將返回一個

[P],如果沒有這樣的字符被發現

所以要找到最後一個反斜槓,並砍掉什麼是它背後ointer在str找到的字符,或空指針,你可以使用

char *ptr; 
ptr = strrchr (address1, '\\'); 
if (ptr) ptr[1] = 0; 

注意明確的測試,看看是否ptr居然發現一個反斜槓。

現在你實際上並沒有想要放棄那個反斜槓後的所有東西,你想複製一些新的東西。對於這一點,你不需要先改短,然後(可能)使用strcat,您可以使用strcpy馬上:

ptr = strrchr (address1, '\\'); 
if (ptr) 
    strcpy (ptr+1, "tmp.txt"); 
else 
    strcpy (address1, "tmp.txt"); 

其個人而言,我通常寫爲

ptr = strrchr (address1, '\\'); 
if (ptr) ptr++; else ptr = address1; 
strcpy (ptr, "tmp.txt"); 

請注意,兩者都使用ptr+1,因爲ptr本身指向「at」反斜槓;你想保留它。

使用字符串連接如下所示存在固有的危險:如果最後一個反斜槓之後的部分短於新插入的字符串,則可以在字符串之後覆蓋數據。這首先取決於整個如何創建address1。一個很髒修復是明確測試如果address1當前內容有足夠的剩餘空間:(我只添加此的完整性;你可能不應該在產品代碼中使用此)

char *to_add = "tmp.txt"; 
ptr = strrchr (address1, '\\'); 
if (ptr && strlen(ptr+1) <= strlen(to_add)) 
    strcpy (ptr+1, to_add); 
else 
    printf ("too long, ignored\n"); 

原因strcpy(和strcat以及相關的字符串函數)無法知道是否有足夠的剩餘空間是因爲簡單的C字符串不會在任何地方存儲可用的最大長度。

相關問題