2012-01-17 77 views
3

我是C編程的新手。 我有這個問題,我不明白。看起來windows下的字符串是以完全不同的方式處理的,爲什麼呢?字符串處理C linux和windows

吳丹是我的代碼

#include <stdio.h> 
#include <string.h> // compare strings 
void addextname(char *str1, char *str2, char *nome1){ 
    int i,j; 
    i = 0; 
    while (str1[i]!='.') { 
     nome1[i] = str1[i]; 
     i++; 
    } 
    j = 0; 
    while (str2[j]!='\0') { 
     nome1[i] = str2[j]; 
     i++; 
     j++; 
    } 
} 

int main() 
{ 
    char str1[9]="file.stl"; 
    char str2[9]="name.stl"; 
    int len1 = strlen(str1); 
    int len2 = strlen(str2); 
    char nome1[len1+len2+1]; 
    addextname(str1,str2,nome1); 
    printf("%s %s %s\n",str1,str2,nome1); 
    return 0; 
} 

我的目的是要讀它的擴展名(.STL)中輸入文件名和一些字符添加到它保持該擴展。在Linux下,我沒有問題,在Windows下,輸出文件名被保存不正確。 我的編譯行是

gcc modstr.c -std=c99 -o strings 

我真的很感激一個問題的答案!

+0

@橋你編輯過哪一行,因爲代碼看起來像前一個 – Nicholas 2012-01-17 09:29:23

+0

括號中的縮進問題,它將代碼塊分成兩個單獨的代碼塊。只是爲了更好的格式:) – qiao 2012-01-17 09:32:43

+0

@喬耶!我認爲這是我的代碼上的東西,但我後來發現答案是: – Nicholas 2012-01-17 09:54:24

回答

10

你不是0-終止nome1。嘗試:

nome1[i] = 0; /* After the second while. */ 
+2

...並且你應該改變'while(str1 [i]!='。')''while(str1 [i]! ='。'&& str1 [i]!='\ 0')'否則addextname會在傳遞一個沒有擴展名的文件名作爲第一個參數時崩潰。 – Axel 2012-01-17 08:19:26

+2

而且您應該從右側開始搜索,因爲文件名可以包含多個句點。 – 2012-01-17 08:20:29

+2

@Axel,Ignacio好的電話:-)或者只是使用'strrchr'? – cnicutar 2012-01-17 08:21:29

0

你所創建的陣列nome1但尚未與任何裝飾它。它是否通靈?

+0

我剛剛初始化了nome1內存地址,並在addextname中「填充」了內存地址。我對嗎? – Nicholas 2012-01-17 09:30:52