You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符串单词长度与数组匹配校验程序开发及代码问题求助

字符串单词长度与数组匹配检查问题解答

需求说明

编写程序,输入一个句子字符串和一个数组,函数需验证数组中的值是否与字符串中每个单词的长度一一对应:

  • 示例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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:21:36