2013-05-18 71 views
0

給定一個像「/documents/filename.txt」這樣的字符串,我需要生成一個新的字符串「/documents/filename_out.txt」,其中新字符串只是將_out附加到文件名,同時保留.txt後綴。我需要一種編輯字符串的方法

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

int main(){; 
    char fileName[80]; 
    printf("Please enter filename: "); 
    scanf("%s", fileName); 
    char outName[]; 

    printf("Outputname: %s\n", outName); 
} 

有沒有一種辦法,也就是說,從一個字符串中刪除最後4個字符文件(.txt),然後追加與「_out.txt」的字符串?

在此先感謝!

+2

這有什麼錯用'海峽{,N} {CPY,貓}()'? –

+0

是的,有一種方法可以做到這一點。我們還能怎樣幫助你?問:「可能嗎?」或「有沒有辦法?」除了說「是的,是」或者「不是,這不是對任何人都沒有幫助」之外,在這裏不應該承擔責任。請[編輯]你的問題,使其更具體。 –

+0

這似乎是在這裏解決:http://stackoverflow.com/questions/779875/what-is-the-function-to-replace-string-in-c – carlosdc

回答

0

使用函數strtok來標記輸入並再次連接它們,並在每個標記之間使用_out。

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

int main(){; 
char fileName[80]; 
printf("Please enter filename: "); 
scanf("%s", fileName); 
char outName[80]; 
char *name, *type; 

name = strtok(fileName, "."); 
type = strtok(NULL, "."); 

snprintf(outName, 80, "%s_out.%s", name, type); 
outName[79] ='\0'; 


printf("Outputname: %s\n", outName); 
} 

PS。我假設你的輸入總是正確的,所以它不檢查任何東西,除非確保outName將始終是一個正確的字符串,用NULL字符結束。

+0

這是一個巨大的雪撬破解一個小螺母。 strstr方法要簡單得多。 –

+0

@VX這只是一個概念證明,而不是一個正確的概念,在生產時是安全的 – Amadeus

+0

@Steve Atkinson如果你可以學習一個解決大多數問題的通用解決方案,並且易於實現,爲什麼要使用你會改變它非常厄運嗎? – Amadeus

1
// strlen(".txt") = 4  
strcpy(filename + strlen(filename) - 4, "_out.txt"); 

您需要確保緩衝區足夠大以容納額外的4個字符。

+0

這工作完美,謝謝! – user2395925

1

下面是您的問題的一個相當具體的解決方案。

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

int main(){ 

    char newSuffix[] = "_out.txt"; 

    char fileName[80]; 
    printf("Please enter filename: "); 
    scanf("%s", fileName); 
    char outName[85]; 

    strcpy(outName, fileName); 
    strcpy(&outName[strlen(fileName) - 4], newSuffix); 

    printf("Outputname: %s\n", outName); 
} 
+0

真棒,這個伎倆,謝謝! – user2395925

0

Google是你的朋友。這是搜索查詢的第一個命中:「c替代字符串」。你需要什麼權利在這裏:What is the function to replace string in C?

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
int main(){ 
    char fileName[80]; 
    printf("Please enter filename: "); 
    scanf("%s", fileName); 
    char outName[]; 
    printf("Outputname: %s\n", replace(filename,".txt","_out.txt")); 
} 


char * replace(
    char const * const original, 
    char const * const pattern, 
    char const * const replacement 
) { 
    size_t const replen = strlen(replacement); 
    size_t const patlen = strlen(pattern); 
    size_t const orilen = strlen(original); 

    size_t patcnt = 0; 
    const char * oriptr; 
    const char * patloc; 

    // find how many times the pattern occurs in the original string 
    for (oriptr = original; patloc = strstr(oriptr, pattern); oriptr = patloc + patlen) 
    { 
    patcnt++; 
    } 

    { 
    // allocate memory for the new string 
    size_t const retlen = orilen + patcnt * (replen - patlen); 
    char * const returned = (char *) malloc(sizeof(char) * (retlen + 1)); 

    if (returned != NULL) 
    { 
     // copy the original string, 
     // replacing all the instances of the pattern 
     char * retptr = returned; 
     for (oriptr = original; patloc = strstr(oriptr, pattern); oriptr = patloc + patlen) 
     { 
     size_t const skplen = patloc - oriptr; 
     // copy the section until the occurence of the pattern 
     strncpy(retptr, oriptr, skplen); 
     retptr += skplen; 
     // copy the replacement 
     strncpy(retptr, replacement, replen); 
     retptr += replen; 
     } 
     // copy the rest of the string. 
     strcpy(retptr, oriptr); 
    } 
    return returned; 
    } 
} 
+0

矯枉過正這樣一個簡單的問題! –

+0

@SteveAtkinson:你可能是對的。你看到過度殺傷的地方,我看到完全的一般性。 – carlosdc

0
char outName[sizeof(fileName)+4]; 
strcpy(outName, fileName); 
strcpy(strstr(outName, ".txt"), "_out.txt"); 
//strcpy(strrchr(outName, '.'), "_out.txt"); 
+0

+添加支票,那strstr發現了什麼...... –

+0

我也在想知道焦慮。但增加了一個支票並留給user2395925。 – BLUEPIXY

相關問題