2014-10-20 168 views
-3

我發現這個程序在線,聲稱以格式「firstName/lastName」分割字符串。我測試,它的工作原理:字符指針和字符串

char *splitString(char* ptrS, char c){ 
    while(*ptrS != c){ 
     if(*ptrS == '\0'){ 
      return NULL; 
     }  
     ptrS++; 
    } 
    return ptrS; 
} 

int main(){ 

    char word[100]; 
    char* firstName; 
    char* lastName; 

    printf("Please insert a word : "); 
    fgets(word, sizeof(word), stdin); 
    word[strlen(word)-1] = '\0'; 

    firstName = word; 
    lastName = splitString(word, '/');  
    if(lastName == NULL){ 
     printf("Error:/not found in string\n"); 
     exit(-1); 
    } 

    *lastName = '\0'; 
    lastName++; 
    printf("First name %s, Last name %s\n",firstName, lastName); 
    return(0); 
} 

什麼,我不過這裏看到的,是創建只有一個字符數組,而firstNamelastName指針放在properly.Maybe那是因爲我有點困惑關於指針和數組之間的關係,但我有幾個關於這個程序的問題:

  • 在程序執行後會生成多少個字符串-as char數組?
  • 在這個程序中使用的字符指針是否與字符串相同?
  • 爲什麼我可以使用那些在printf中用作字符串的char指針?我可以在每個C程序中使用字符指針作爲字符串?

作爲推論,指針和數組之間有什麼關係?它們可以互換使用嗎?

+3

你知道C中字符串的定義嗎?最好不要一起提出這麼多問題,如果你有一點點谷歌問題,至少可以找到一些問題的答案。 – 2014-10-20 13:34:41

回答

1

在程序執行後會生成多少個字符串-as char數組?

有1個字符數組在這個程序中,即word[100],有些人喜歡firstNamelast Name只是字符指針..

在這個程序中的相同字符串中使用的字符指針?

字符指針爲字符串很大的不同,字符指針的東西,你可以用在charstring點。在這個程序中firstNamelastName僅僅是用來點在字符數組word[]的不同的地方分成數組字符指針

2

多少執行程序後弦-as焦炭arrays-生產?
您有一個char[],大小爲100。但是,在程序執行結束時,實際上有兩個字符串存儲在其中。

string'\0'null/0)封端的一組的連續存儲在存儲器char秒。
在這個程序中,我們採取輸入,並尋找'/'字符。當找到,它會被替換字符串結束:

"John/Smith\0" 
"John\0Smith\0" 

的指針數組的開頭將允許我們訪問的第一個字符串(「約翰」),而先前指向'/'字符指針遞增,所以它現在指向"Smith"

初始化:

"John/Smith\0" 
^  
|  
word/firstname 

lastName = splitString(word, '/');後:

"John/Smith\0" 
^ ^
| lastname 
word/firstname 

*lastName = '\0'; lastName++;

"John\0Smith\0" 
^ ^
|  lastname 
word/firstname 

所以還有隻有一個陣列(word),但你有兩個指針(firstname & lastname)內的字符串。

該程序中使用的字符指針是否與字符串相同?
char*指針不是字符串,但它們指向它們。您可以將指針傳遞給期望字符串的任何函數(我在下面展開一點)

爲什麼我可以在printf中使用那些用作字符串的char指針?我可以在每個C程序中使用字符指針作爲字符串?
在C(和C++)函數中不能傳遞數據數組。像這樣的功能:

int func(char string[]){} 

實際上不會通過數組本身,而是它會被傳遞一個指向數組的開始。
通常情況下,使用[]表示法,其中函數將在數組上運行(在函數頭中,char* strchar str[]是等效的),因爲它消除了指針不在那裏引用單個的任何歧義性char(或int等)。
Printf()指向字符串,並知道它是一個字符串(感謝格式字符串中的%s標識符),它將從指針標識的內存位置打印出每個char,直到它遇到'\0'字符。
一個有效的字符串總是有這個終結符,所以當使用字符串時,這是安全的。
你會經常看到,採取的陣列的功能,和一個額外的參數來表示數組的大小:

int do_something_with_array(int array[], size_t array_length){} 

這是因爲沒有一個終止值或知道數組的大小,也沒有辦法要知道您已經離開陣列並開始處理out of bounds這是不允許的,並且可能導致內存損壞或導致運行時中止程序(崩潰)。

這是一個常見的誤解,指針和數組是相同的。
在大多數情況下,你通過指針來處理數組,所以處理數據是相同的,無論你有一個數組還是一個指針。然而,有些事情需要記住。以this爲例。

+0

非常好的解釋:) – 2014-10-20 21:52:26