2010-08-31 32 views
8
char out_file_name[30]; 


ogSize = strlen(FileName); //i.e. - FileName_anylength.log (always.log) 
ogSize -= strlen(IN_FILE_SUFFIX); //amount of chars before .log 

strncpy(out_file_name, FileName, ogSize); //out_file_name now is FileName_anylength (without the .log) 

इस यह करने के लिए सबसे अच्छा तरीका है?क्या स्ट्रिंग को छोटा करने का कोई और तरीका है?

इसके अलावा, मैं कैसे की रक्षा कि ogSize 30 से अधिक वर्ण होने के लिए नहीं होता है के रूप में यह उपयोगकर्ता इनपुट से आ रहा है?

धन्यवाद।

+1

आप पहले जोड़ें मतलब है? या स्ट्रिंग निष्कर्षण? काटें? –

+1

मुझे लगता है कि आप "truncate" का मतलब है (आप स्ट्रिंग के अंत से तत्वों को हटाना चाहते हैं, इसे कम लंबाई में छोटा कर सकते हैं, है ना?) –

+0

ट्रंकेट - वह एक है। धन्यवाद। क्षमा करें, अंग्रेजी मेरी पहली भाषा है .... हाँ पहले, यही कारण है कि यह इतना बुरा है। –

उत्तर

17
एक सी शैली स्ट्रिंग के साथ

, तो आप सिर्फ चरित्र आप \0 करने पर काट-छांट करना चाहते हैं निर्धारित कर सकते हैं।

आपके दूसरे प्रश्न के बारे में, मूल रूप से आप जांचते हैं। या स्ट्रिंग आकार के आधार पर आपको जितनी मेमोरी चाहिए उतनी मेमोरी आवंटित करें (उस \0 के लिए कमरा शामिल करना याद रखें)।

+1

+1 अच्छी चाल।स्ट्रेलन \ 0' –

+0

@ जकरियन के पहले उदाहरण पर रुक जाएगा: अच्छा समाधान, धन्यवाद। –

2

यह एक रूप दें:

char *trunc; 
char *outfile; 

strdup(outfile, FileName); 

if (((trunc = strstr(out_file_name, ".log")) != NULL) 
*trunc = '\0'; 

return (outfile); // assumes returning result from function 
+0

strdup एएनएसआई सी नहीं है (कोई सी 8 9, कोई सी 99 नहीं) – user411313

+0

यह अधिकांश वातावरण में सुरक्षित रूप से उपयोग किया जाने वाला मानक और मानक है: आईईईई 1003.1, 2004, (http://www.opengroup.org/onlinepubs/009695399/functions /strdup.html); एसवीआर 4, 4.3 बीएसडी, पॉसिक्स .1-2001 (http://linux.die.net/man/3/strdup), और यूनिक्स 98 (http://www.mkssoftware.com/docs/man3/strdup.3। एएसपी)। इसके अलावा, मेरा समाधान स्रोत स्ट्रिंग की लंबाई के बारे में कोई धारणा नहीं बनाता है और यह इसे संरक्षित करता है। – BillP3rd

2

पहले अपने आखिरी सवाल उठाते हुए यह सुनिश्चित करना अधिकतम आकार बहुत आसान है। आमतौर पर आप स्ट्रिंग को पढ़ने के लिए fgets का उपयोग करना चाहते हैं। यह आपको अधिकतम लंबाई निर्दिष्ट करने की अनुमति देता है। वैकल्पिक रूप से, आप स्कैनफ़ प्रारूप में अधिकतम आकार निर्दिष्ट कर सकते हैं (उदा।, "%29s" या "%29[^\n]")। दोनों के बीच का अंतर ध्यान दें: fgets के साथ आप बफर आकार निर्दिष्ट करते हैं, लेकिन scanf के साथ आप बफर आकार से कम निर्दिष्ट करते हैं (यानी, पढ़ने के लिए वर्णों की अधिकतम संख्या)।

पहला सवाल का सवाल है: हाँ, वहाँ आम तौर पर बेहतर तरीके हैं। strncpy एक अजीब कार्य है, मूल रूप से एक काफी विशिष्ट उद्देश्य के लिए लिखा गया है, और (ईमानदार होने के लिए) को मानक पुस्तकालय से हटा दिया जाना चाहिए, क्योंकि लगता है जैसे यह उपयोगी होना चाहिए, यह लगभग वास्तव में कभी नहीं है।

मैं शायद चीजों को थोड़ा अलग करता। , इस तरह आप तार का एक अधिकतम लंबाई

char* from = FileName; 
char* to = out_file_name; 
int curLen = 0; 

do 
{ 
    *to++=*from++ 
} 
while(*from && *from!='.' && ++curLen < ogSize); 

*to='\0'; 
+1

अगर out_file_name कोई सरणी नहीं है, तो आपका उदाहरण काम नहीं करता है। स्नप्रिंटफ नहीं है C89 – user411313

2

उपयोग fgets() उपयोगकर्ता से स्ट्रिंग को पढ़ने के लिए: एक संभावना यह snprintf, की तरह कुछ का उपयोग किया जाएगा इसे छोटा करने के लिए स्ट्रिंग में एक नल डालें। फ़ंक्शन स्ट्रैस्ट() के नीचे ".log" की पहली घटना का पता ढूंढने के लिए उपयोग किया जाता है। इसके बाद आप नाम की लंबाई और नल डालने के लिए एक-दूसरे से दो पते घटा सकते हैं।

int main() { 
    char suffix[] = ".log"; 
    char filename[] = "FileName_anylength.log"; 
    char* end_address = strstr(filename, suffix); 
    filename[end_address-filename] = 0; 
    printf("%s", filename); 
} 
+1

एक से अधिक 'के लिए काम नहीं करता है। – user411313

1

आप कर सकते हैं निर्दिष्ट कर सकते हैं

snprintf(
    out_file_name, 
    sizeof(out_file_name), 
    "%*s", 
    strlen(FileName) - strlen(IN_FILE_SUFFIX), FileName); 
+1

से @ बिलपी 3rd - माफी बिल, हमने देखा कि हमारे पास समान उत्तर थे। मुझे तुम्हारा बेहतर पसंद है, कोई घटाव नहीं। - चीयर्स :) – skimobear

1
char out_file_name[30]; 
char *suffix=".log"; 
size_t IN_FILE_SUFFIX = strlen(suffix); 

/* also works, if suffix occurs more than 1 time or never ! */ 
if(strstr(out_file_name, suffix)) 
    out_file_name[ strlen(out_file_name) - IN_FILE_SUFFIX ] = 0; 

या

char out_file_name[30]; 
char *suffix=".log"; 
size_t IN_FILE_SUFFIX = strlen(suffix); 

/* also works, if suffix occurs more than 1 time or never ! */ 
if(strstr(out_file_name, suffix)) 
{ 
    char format[20]; 
    sprintf(format, "%%.%ds", strlen(out_file_name) - IN_FILE_SUFFIX); 
    sprintf(out_file_name, format, out_file_name); 
} 
संबंधित मुद्दे