在C语言中判断英语句子中每个单词的长度,可以通过以下步骤实现:
一、基本思路
字符串分割:
将整个句子按空格或标点符号分割成单词。
长度计算:
对每个单词使用`strlen`函数计算其长度。
结果存储:
将计算结果存储在数组或结构体中,便于后续处理(如排序或输出)。
二、实现方法
1. 使用`strtok`函数分割单词
`strtok`函数可按指定分隔符将字符串分割为子串。需注意,`strtok`会修改原字符串,建议先复制一份再操作。
```c
include include int main() { char sentence = "Hello, world! This is a test."; char *token; int word_lengths = {0}; // 假设最多100个单词 int index = 0; // 复制句子以避免修改原字符串 strcpy(sentence, "Hello, world! This is a test."); token = strtok(sentence, " \t\n.,!?"); // 以空格、制表符、换行符、逗号、句号、问号、感叹号分隔 while (token != NULL) { word_lengths[index++] = strlen(token); token = strtok(NULL, " \t\n.,!?"); } // 输出每个单词长度 for (int i = 0; i < index; i++) { printf("%s: %d\n", token, word_lengths[i]); } return 0; } ``` 2. 处理特殊情况 标点符号:上述代码将标点符号视为单词的一部分(如"it's"算长度4),根据需求可调整分隔符。 连续空格:`strtok`会自动忽略连续空格,无需额外处理。 3. 进阶优化(不修改原字符串) 若需保留原字符串,可先使用`strlcpy`复制,再分割: ```c include include int main() { char sentence = "Hello, world! This is a test."; char *copy = strdup(sentence); // 复制原字符串 char *token; int word_lengths = {0}; int index = 0; token = strtok(copy, " \t\n.,!?"); while (token != NULL) { word_lengths[index++] = strlen(token); token = strtok(NULL, " \t\n.,!?"); } // 输出结果 for (int i = 0; i < index; i++) { printf("%s: %d\n", token, word_lengths[i]); } free(copy); // 释放复制的内存 return 0; } ``` 三、完整示例代码 综合上述方法,以下是完整的示例代码,包含输入处理和错误检查: ```c include include include int main() { char sentence; printf("请输入一句话:"); if (fgets(sentence, sizeof(sentence), stdin) == NULL) { printf("输入错误\n"); return 1; } // 去除末尾换行符 size_t len = strlen(sentence); if (len > 0 && sentence[len - 1] == '\n') { sentence[len - 1] = '\0'; } char *token = strtok(sentence, " \t\n.,!?"); int word_lengths = {0}; int index = 0; while (token != NULL) { word_lengths[index++] = strlen(token); token = strtok(NULL, " \t\n.,!?"); } // 输出每个单词长度 printf("单词长度:\n"); for (int i = 0; i < index; i++) { printf("%s: %d\n", token, word_lengths[i]); } return 0; } ``` 四、注意事项 示例中假设最多100个单词,实际使用时应根据输入长度调整数组大小,避免溢出。 对于大规模文本处理,建议使用动态内存分配(如`malloc`)或更高效的字符串处理库。 根据需求调整分隔符,例如是否将撇号(')包含在单词内。 通过上述方法,可灵活实现数组大小:
性能优化:
标点符号处理: