2017-01-26 85 views
0

我有一個我沒有寫過的程序。它應該從字符串中刪除空格,並將其轉換爲駱駝格式。例如:從字符串中刪除空格並將其轉換爲駱駝格式C

輸入:Hello World!
應該給:helloWorld!

現在我有幾個關於這個程序的問題。

#include <stdio.h> 
#include <ctype.h> 

char *convert(char *f) { 

    char *save = f; 
    char *output = f; 
    int in_a_word = 1; 

    while(isspace(*f)) f++; 
    for(; *f; f++) { 

      if(isspace(*f)) in_a_word = 0; 
      else 
      { 
       if(in_a_word) { 
       *output= tolower(*f); 

       } 
       else { 
        *output = toupper(*f); 

       } 
       in_a_word = 1; 
       output++; 


      } 
     *output= '\0'; 
     } 
    return save; 

    } 


int main(void) { 

char str[] = " Hello World\t"; 
printf("Modified: -->%s<---\n", convert(str)); 
getchar(); 
} 

我的問題:

char *save = f; 
char *output = f; 

如果我理解正確的,他們兩人都應該指向F。我寫了一個實驗程序:

int main(void) { 

char *s = " Hello"; 
char *ment = s; 
printf("Original:\n-->%s, %p<---\n-->%s, %p<---\n\n", s,s,ment,ment); 
while(isspace(*s)) s++; 
printf("Modified:\n-->%s, %p<---\n-->%s, %p<---", s,s,ment,ment); 
getchar(); 
} 

在這個程序中我保存了s的地址。當我使用第一個printf時,它顯示它們完全平等,並且指向相同的位置。我對s進行了一些修改。這消除了所有的空間,但是保持不變。甚至他們的位置也改變

回到原來的程序。在convert函數中,我們正在返回保存,但尚未修改。所以我的問題是:任何人都可以解釋我們爲什麼要返回保存?和/或我應該參考哪些源材料。我讀了幾本關於指針的書,但沒有人提到過這個。

回答

0

在convert函數中,我們正在返回保存,但它沒有被修改。所以我的問題是:任何人都可以解釋我們爲什麼要返回保存?

save是存儲字符串的原始位置。需要注意的是output指針函數內修改:

output++; // output pointer has been modified to point to next character 

所以你不能返回output本身 - 你想返回字符串的原始位置。

換句話說,有在該函數的兩個指針的不同的目的:

  • output被修改字符串的內容(在整個功能這個指針的變化)
  • save是存儲原始字符串的位置(這個指針在函數中沒有改變)並且把它返回給調用函數
+0

但是爲什麼它如果我有原始位置呢?根據我編寫的程序(簡短的程序),修改完全沒有改變。一開始,他們都指向同一地點。但是在我修改s後,s的內容和位置發生了變化。基於同樣的邏輯,我保存了f的位置,但不是它應該指向f最初指向的位置,即原始字符串?對不起的解釋,我剛開始指出。 –

+0

,因爲你的'convert'函數返回一個字符指針。如果不保存'f',你最終會返回字符串的結尾(指向空字符)而不是整個字符串(從頭開始) – artm

+0

是的,這是一個很好的答案,謝謝。我已經接受了。 –

相關問題