2015-08-03 79 views
1

我有一個問題,內容如下:複製字符串數組實現Ç

寫函數int tokenCopy(字符* DEST,常量字符* SRC,INT destSize)從給定的源串拷貝的字符SRC到給定的目標緩衝區DEST,這是大小destSize的,直到:

串發生源的端部,或

目標緩衝區已滿(允許將要需要的終止子),或

a sp ace字符在輸入字符串中找到

以先到者爲準。如果因爲找到空格而完成複製,則不會複製該空間。目標字符串必須始終正確終止。如果源字符串的目標地址空間不足,則目標字符串必須是源字符串正確終止的前導子字符串。

返回值是複製的字符數,不包括終止空字節。

這是我嘗試迄今:

int tokenCopy(char* dest, const char* src, int destSize) 
    { 
     int the_slab = 0; 
     for (; *src != ('\0' | ' '); the_slab++) 
     { 
      if (*src == (32 | 0)) 
      { 
       *dest = '\0'; 
       return the_slab; 
      } 
      *dest = *src; 
      dest++; 
      src++; 
     } 
     *dest = '\0'; 
     return the_slab;  
     } 

然而,當被測試的失敗:

char buff[10]; 
int n = tokenCopy(buff, "This", 10); 
printf("%d '%s'\n", n, buff); 

,因爲它返回,而不是4 爲什麼不終止後7號它處理了前四個字母?我不明白爲什麼src沒有終止字節?

我做了什麼錯?在概念上我不瞭解什麼?

謝謝!

+0

的可能重複的[執行塊變量是否不一些具體值之一(http://stackoverflow.com/questions/26337003/execute-block-if-a-variable-是不是一個特定值) – Barmar

+0

雖然,建議的d重複看起來像重複,答案真的很混亂,並沒有解決一個簡單的問題。更糟糕的是,這個例子比較了諸如'「x」'的c字符串和'=='運算符! –

+0

誰在乎?問題在於基本的語言結構,如果不是dup,會因其他原因而關閉。有許多。許多對這種複合條件基礎知識的誤解。 –

回答

4

*src != ('\0' | ' ')不會做你認爲的事情。

你需要把它分成兩個:與

*src != '\0' && *src!= ' ' 

相同:

if (*src == (32 | 0)) 

它應該是:

if (*src == ' ' || *src) 

它總是最好使用字符表示' '比假設/依賴於ASCII值。

事實上,在循環內的整個條件是reduntant:

if (*src == (32 | 0)) 
     { 
      *dest = '\0'; 
      return the_slab; 
     } 

這就是你在for循環條件測試什麼了。

+0

是的,基本上是''\ 0'| '''等同於''',而'(32 | 0)'等同於'32'),因此從不測試空字符。 – NiBZ

2

|運算符對兩個操作數執行按位「或」運算 - 完全不是你想要的。

C bitwise OR operations

你的測試應該使用邏輯OR運算符,||

if (*src == ' ' || *src == '\0') 
2

這是一個真正的評論,但評論不允許正確的代碼格式。我同意@JohnPirie和@BlueMoon的答案。

這是一個例子,其中使用陣列的索引是清潔器然後使用指針,如圖代碼如下:

int tokenCopy(char* dest, const char* src, int destSize) 
{ 
    int i; 
    if (dest == NULL || source == NULL || destSize < 1) { 
     // invalid input! 
     return -1; 
    } 
    for (i = 0; i < (destSize-1) && src[i] != '\0' && src[i] != ' '; i++) { 
     dest[i] = src[i]; 
    } 
    dest[i] = '\0'; 
    return i; 
} 
+0

你是對的;下標更容易閱讀 –

0

操作|是bitwize(OR)運算符。 (*src == (32 | 0))if (*src == 32)相同的說明。因爲32|0==32; 記得邏輯表?:

0 | 0 = 0 
0 | 1 = 1 
1 | 0 = 1 
1 | 1= 1 

bitwize操作比較dest的一個來源的每一位,因爲0的所有位斷,在32每一位保持不變

你必須這樣做,所以它的工作原理:

if ((*src == 32) || (*src== 0)) { ...