2013-10-26 77 views
0

我遇到問題。這個函數需要清除任何非字母字符串,同時降低所有的字母字符。使用指針,p_fast檢查字符串中的字符是否爲isalpha;如果是,則該字符被存儲到p_slow中。在整個字符串中完成此操作後,將添加一個\0字符以完成字符串。在此之後,我需要將字符串中的第一個字母大小寫爲剛剛清理過的小寫字母。在字符串中首字母大寫c

/**********************************************************************/ 
/*      Clean up customer names      */ 
/**********************************************************************/ 
void clean_names(int quantity, 
           struct customer *p_customer_records_start) 
{ 
struct customer *p_customer; 
char *p_fast = p_customer_records_start->customer_name, 
*p_slow = p_customer_records_start->customer_name; 


for(p_customer = p_customer_records_start; 
    (p_customer-p_customer_records_start) < quantity; p_customer++) 
{ 
    p_fast = p_customer->customer_name; 
    p_slow = p_customer->customer_name; 

while (*p_fast != END_OF_STRING) 
{ 
    if(isalpha(*p_fast)) 
     *p_slow++ = tolower(*p_fast); 
    p_fast++; 
} 

*p_slow = END_OF_STRING; 

} 
return; 
} 

我不知道如何回到字符串的開頭。我在互聯網上找不到任何東西。如果有人能夠幫助,那會很棒!如果您需要更多信息,只需詢問。

+0

該字符串的開頭仍然在'p_customer-> customer_name' – Kninnug

+0

@Kninnug我意識到這一點,但'toupper(* p_customer-> customer_name);'沒有效果。還有其他建議嗎? –

+2

你會想''p_customer-> customer_name = toupper(* p_customer-> customer_name;'即分配字母。 – Kninnug

回答

2

您從p_customer->customer_name中的指針開始。最後,該指針仍指向相同的位置(到名稱的開頭)。你可以用它來大寫第一個字母。

+0

我會怎麼做,我已經嘗試過'toupper(* p_customer-> customer_name);'已經,它不會做任何事情 –

+3

'toupper'不會做任何事情,它會返回一些東西,你必須把它分配到某個地方,就像你在循環中使用'tolower()'一樣。 – Barmar

+0

@Barmar我明白你的意思了意思是,我只是拿着你說的和應用它,它的工作,謝謝 –

0

非常簡單:toupper只能在每次調用一個字符時使用。如果你做這樣的事情:

p_customer->customer_name[0]=toupper(p_customer->customer_name[0]);

它只有大寫首字母。