字符串单词长度与数组匹配校验程序开发及代码问题求助
字符串单词长度与数组匹配检查问题解答
需求说明
编写程序,输入一个句子字符串和一个数组,函数需验证数组中的值是否与字符串中每个单词的长度一一对应:
- 示例1:输入句子
"This is an example.",对应数组应为[4,2,2,7] - 示例2:输入句子
"Space... The final frontier...",对应数组应为[5,3,5,8]
遇到的问题
- 如何不将单词长度存入另一个数组,直接检查其与数组中的值是否相等?
- 为何代码会将
.、!这类符号识别为单词? - 为何
lengthofstring始终为0?是if语句存在错误吗?
当前代码
int checklength(const char *str,int array[],int n) { int i,j=0,start=0,end,lengthofword,lengthofstring,isittrue=0; while(*(str+lengthofstring)!='\0') { lengthofstring++; } for(i=0;i<lengthofstring+1;i++) { if((*(str+i)>=32 && *(str+i)<=64) || (*(str+i)>=91 && *(str+i)<=96) || (*(str+i)>=123 && *(str+i)<=126)) { end=i; lengthofword=end-start; //Why is my lengthofword 0 here? //Here is what I tried for checking if value is in array: j++; while(j<n) { if(array[j]==lengthofword) { isittrue=1; } break; } } start=i+1; } return isittrue; }
问题解答
1. 直接检查单词长度与数组值的方法
不需要额外数组,核心思路是边遍历字符串识别单词,边和数组对应位置的值对比:
- 维护一个数组索引变量(比如
arr_idx,初始为0) - 每识别出一个完整单词的长度后,先判断
arr_idx是否超出数组长度(避免越界),然后直接对比当前长度和array[arr_idx] - 只要发现不匹配,直接返回0;匹配则
arr_idx自增,继续处理下一个单词 - 遍历结束后,必须检查
arr_idx是否等于数组长度n,确保所有数组元素都对应到了单词,没有遗漏或多余
2. 符号被识别为单词的原因
你的代码逻辑是遇到符号就计算一次长度,但没有区分“单词结束的分隔符”和“符号本身”。比如字符串末尾的.,此时start是.的前一个位置+1,计算出的长度为0,相当于把空内容当成了单词。
正确逻辑应该是:
- 先跳过所有非字母字符,找到单词的起始位置
- 然后统计连续字母的长度,得到真正的单词长度
- 这样就不会把符号误判为单词的一部分,也不会生成空的“假单词”
3. lengthofstring始终为0的原因
lengthofstring初始为0,循环while(*(str+lengthofstring)!='\0')的作用是统计字符串长度。如果它始终为0,说明*(str+0)就是'\0'——要么你传入的是空字符串,要么str指针指向了无效的空地址。
另外,你的for循环条件i<lengthofstring+1会导致多循环一次,超出字符串的有效索引范围(字符串索引是0到lengthofstring-1),可能引发越界访问问题。
优化后的参考代码
#include <ctype.h> // 利用isalpha函数判断字符是否为字母 int checklength(const char *str, int array[], int n) { int arr_idx = 0; int word_len = 0; int in_word = 0; // 标记是否正在统计单词长度 while (*str != '\0') { if (isalpha((unsigned char)*str)) { // 当前是字母,累加单词长度 word_len++; in_word = 1; } else { // 当前是非字母,检查是否刚结束一个单词 if (in_word) { // 对比数组对应位置的值,不匹配直接返回0 if (arr_idx >= n || array[arr_idx] != word_len) { return 0; } arr_idx++; word_len = 0; in_word = 0; } // 跳过非字母字符 str++; continue; } str++; } // 处理字符串末尾的单词(如果字符串以单词结尾) if (in_word) { if (arr_idx >= n || array[arr_idx] != word_len) { return 0; } arr_idx++; } // 验证数组所有元素都对应了单词,无遗漏或多余 return (arr_idx == n) ? 1 : 0; }
内容的提问来源于stack exchange,提问作者user20941117
相关产品推荐
相关产品推荐

