2017-05-18 95 views
1

我有字符數組0123'它包含一些單詞,我必須從它讀取所有單詞而不使用字符串庫(不能使用strtok)。下面是我有:
讀字符數組一字一字無字符串函數

int wordsCount = 0; 

for (int i = 0; words[i] != '\0'; i++) { 
    if (words[i] == ' ') 
     wordsCount++; 
} 
wordsCount++; 

char word[30]; 
for (int i = 0; i < wordsCount; i++) { 
    sscanf(words, "%s", word); 
} 


該代碼只讀取第一個字,我想我必須添加一些sscanf,但我不知道是什麼或者是有其他的ANE的方法來達到我的目標?

+1

您是否在第一次for for後檢查'wordsCount'的值? – Sniper

+1

如果單詞超過30個字符,該怎麼辦?你的程序有一個緩衝區溢出。他們正在教導如何創建不安全和不穩定的C++程序? – PaulMcKenzie

+0

你應該讀什麼字?當然不是一個字? O_o – George

回答

2

假如你想使用CI/O API留着,你可以利用內置的空格跳躍的std::scanf功能:

int main() { 
    char const *str = "She sells seashells by the seashore"; 
    char word[30]; 
    unsigned wordLength; 

    for(; std::sscanf(str, " %29s%n", word, &wordLength) == 1; str += wordLength) 
     std::printf("Read word: \"%s\"\n", word); 
} 

輸出:

Read word: "She" 
Read word: "sells" 
Read word: "seashells" 
Read word: "by" 
Read word: "the" 
Read word: "seashore"

當然,你應該檢查錯誤比我沒有更好;)

Live demo

0

你需要增加你閱讀後的指針:

char word[30]; 
int offset = 0; 
for (int i = 0; i < wordsCount; i++) { 
    sscanf(words, "%s", word); 
    offset += strlen(word) + 1; 
} 

*以上預期,如果你words包含連續的空間代碼將無法正常工作。你需要考慮如何修正偏移量。

使用std::string streamstd::string的BTW會更容易和更安全。

std::istringstream iss (words); 
std::string word; 
while(iss >> word) do_something(word); 
+0

在sscanf中將'offset'添加到'words'後它有效,謝謝 –