2014-04-09 30 views
0

嘗試當我嘗試編譯底部的代碼做一個任務,我得到以下調試斷言失敗存根:調試斷言失敗的錯誤與空終止字符數組

文件:F:\ DD \ vctools \ CRT \ crtw32 \轉換\ istype.c

線:56

李毅華C> = -1 & &ç< = 255

幾個問題似乎與此錯誤消息apparant。我甚至沒有f驅動器或目錄,除非該行被計入isctype.c程序中,否則我的代碼中沒有56行。

目標是計算用戶輸入的單詞數量。事先檢查空格以及空終止字符。

if (isspace(wordArray[i] && isspace(wordArray[i + 1]))){ 

有幾個問題:

下面的代碼已根據從其他用戶

#include <stdafx.h> 
#include <iostream> 
#include <string.h> 
#include <cctype> 

using namespace std; 

int wordCount(int size, char wordArray[]); 

int main(){ 
    const int SIZE = 100; 
    char wordArray[SIZE]; 

    cout << "What is the string you wish to enter? "; 
    cin.getline(wordArray, sizeof(wordArray)); 

    cout << "The number of words entered is: " << wordCount(strlen(wordArray), wordArray) << endl; 
} 

int wordCount(int size, char wordArray[]){ 

    int charCount = 0, wordCount = 0; 

    //counts the number of words in the entered string 
    for (int i = 0; wordArray[i] != '\0'; i++){ 
     if (isalnum(wordArray[i])){ 
      charCount++; 
      if (isspace(wordArray[i + 1])){ 
       charCount = 0; 
       wordCount++; 
      } 
     } 
    } 
    return wordCount; 
} 

回答

2

此代碼的註釋得到修復。您的括號錯誤,因此您使用布爾參數調用issspace

此外,您應該從strlen中獲取字符串的大小,此時您正在循環過字符串的末尾。斷言可能正在發生,因爲您將一個無效的char值傳遞給isspace(例如負數)。

編輯:另外要注意的下一行:

wordArray[i] = wordArray[i++]; 

是不會做你想做的。您想要將字符串的其餘部分移回原來的位置,而不是將一個字符複製到另一個字符。

+0

+1,很好。 :) – ppl

+0

好吧,我添加了一個paren到wordArray [i]結尾)。考慮到你對下一行的關注,我還應該添加代碼來減小數組的大小嗎?因爲我看到的每個地方都有相同的代碼。 – koodeta

+0

下一行只會將一個字符複製到另一個字符,或者可能本身。它複製哪個角色是** undefined **,因爲您無法確定是先評估左側還是右側。你會以'wordArray [i] = wordArray [i]; i ++'或'wordArray [i + 1] = wordArray [i];我++',這兩者都不是你想要的。在這種情況下,你不想增加'i'。你需要做的是將整個字符串的其餘部分移回一個,你可以通過循環或'memmove'來完成。無論如何,我不確定你甚至想要改變字符串。 –

2

您收到此錯誤消息的原因是因爲isspace()接受整數值(int),但對字符(通常爲char類型)進行操作。您必須傳遞isspace()處理的域之外的未初始化的負值。傳遞的值不正確,並且ispace()實現輕微地告知您軟件中存在此錯誤。圖書館必須在有f:\驅動器的機器上編譯。該實現有超過56行的代碼。

也...

使用wordCount(strlen(wordArray), wordArray),而不是通過SIZE。否則,你會讀取未初始化的值,這是不好的。

而不是run = false使用break並用while(1)代替。此循環很可能不會做你認爲它的作用。你只是用第二個字節覆蓋第一個字節。您可能想要將所有字符移至左側。

在您的上一個循環中,迭代直到您遇到空字節('\0')而不是size,因爲這也是不正確的。請注意,字符串現在可能小於size;或許size根本不應該是一個參數...

鑑於這些問題,下面是解決問題的另一種方法,它不需要修改原始字符串。

int count_words(const char *s) { 
    int count = 0; 
    bool in_word = false; 
    while (*s != '\0') { 
     if (isspace(*s)) { 
      in_word = false; 
     } 
     else if (in_word == false) { 
       count += 1; 
       in_word = true; 
     } 
     ++s; 
    } 
    return count; 
} 
+0

我應該使用!isalnum(wordArray [i])而不是isspace()嗎?而對於最後一個循環,這是做到這一點的正確方法嗎? for(int i = 0; i <'\ 0'; i ++) – koodeta

+0

取決於你想要做什麼..檢查字母數字字符或空白字符?最後一個循環條件應該是'wordArray [i]!='\ 0''。 – ppl

+0

我只是檢查空格。無論角色在那裏,我都不在乎。我只是將它們包含在單詞中。 – koodeta

0

此斷言錯誤來自C運行時庫內部。據推測,它是由擁有F驅動器的人制造的。行號在該源代碼中。

斷言的原因是您正在嘗試測試不是有效字符的字符類型。最可能的候選者是字符串終止符的空端。

您不應該傳入大小,而是使用strlen()來查找它。那麼你將不會陷入空。

for (int i = 0; i < strlen(wordArray); i++) { ... 

3個循環的每一個都是越野車,並且不會做任何評論說的。你應該先解決上述兩個問題,然後看看你是否可以調試代碼。