C语言中统计字符串单词首字母匹配数的函数问题求助
Hey there! Let's figure out why your count isn't hitting the expected value—this is such a common pitfall for new C programmers, so don't worry, you're in good company. Let's break down the most likely issues and how to fix them.
1. You're not properly identifying word start positions
The biggest mistake here is usually not checking whether a character is actually the first character of a word. A word starts either at the very beginning of the string, or right after a space (assuming words are separated by spaces). If your code just counts every occurrence of the target character, it'll count all matches, not just word beginnings.
Example of incorrect code:
int count_matching(char *str, char target) { int count = 0; for (int i = 0; str[i] != '\0'; i++) { if (str[i] == target) { count++; } } return count; }
For your test case "Beautiful skies" and target 's', this would work by accident, but if the string had an 's' in the middle of a word (like "Beautiful seas"), it would count 2 instead of 1. Worse, if your target was 'B', it would count correctly here, but fail if the string started with spaces.
Fixed code that tracks word starts:
int count_word_first_letters(char *str, char target) { int count = 0; int is_new_word = 1; // Flag to track if next char is a word start for (int i = 0; str[i] != '\0'; i++) { if (str[i] == ' ') { is_new_word = 1; // Space means next non-space is a new word } else if (is_new_word) { // We found the start of a word if (str[i] == target) { count++; } is_new_word = 0; // Reset flag after checking the first letter } } return count; }
2. You're not handling case sensitivity
If your test case uses a lowercase 's' but the word starts with an uppercase 'S' (or vice versa), your code won't match. For example, if the string was "Beautiful Skies" and target was 's', the count would be 0 instead of 1.
Fix with case normalization:
Add the <ctype.h> header to use tolower() or toupper() to make the comparison case-insensitive:
#include <ctype.h> int count_word_first_letters(char *str, char target) { int count = 0; int is_new_word = 1; char normalized_target = tolower(target); for (int i = 0; str[i] != '\0'; i++) { if (str[i] == ' ') { is_new_word = 1; } else if (is_new_word) { if (tolower(str[i]) == normalized_target) { count++; } is_new_word = 0; } } return count; }
3. Initialization or loop boundary errors
Double-check these easy-to-miss details:
- Did you initialize
countto 0 (not 1)? Starting at 1 would immediately overcount. - Is your loop condition checking for
str[i] != '\0'? C strings end with a null terminator, so stopping at'\n'or another character would cut the loop short. - Are you handling leading spaces? If your string starts with spaces (like
" Hello skies"), the code above still works because it setsis_new_wordto 1 when it hits spaces, then triggers the check on the first non-space character.
Quick Test for Your Case
If you plug your test string "Beautiful skies" and target 's' into the fixed code above, it should return 1 as expected. Compare this to your own code—chances are you missed the is_new_word flag logic that tracks when you're at the start of a word.
内容的提问来源于stack exchange,提问作者Asm .

