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

实现Python split()函数的C代码输出不一致问题求助

问题分析与修复

你的代码出现长度计算错误的核心原因是C语言字符串依赖\0(空字符)作为终止标志,而你的实现没有正确处理这一点,加上内存初始化的问题,导致strlen读取到随机内存数据。

具体问题点

  1. temp数组未初始化:局部数组在栈上创建时默认是垃圾值(随机内存内容)。填充字符到temp后,你没有手动添加\0,strlen(temp)会一直向后读取,直到找到内存中某个随机的\0,这就导致长度计算随机错误(输入字符串变长后,内存布局变化,随机\0的位置也会改变)。
  2. empty_arr函数逻辑错误:这个函数依赖*a != '\0'来停止清空操作,但如果temp中没有\0(比如填充后没加),它会越界修改内存,破坏其他变量的存储,进一步引发不可预测的错误。
  3. 参数传递类型不匹配:main中调用strsplit(&str1, &str2)时,&str2是指向数组的指针,而函数参数要求unsigned long *;&str1是指向字符数组的指针,函数参数要求char *,虽然C会隐式转换,但这是不规范的写法,容易引发问题。

修复后的代码

#include <stdio.h>
#include <string.h>

int strsplit(char *, unsigned long *);

int main()
{
  char str1[] = "help me out man"; // 可修改的输入字符串
  // 单词数量最多为字符串长度+1(极端情况全是空格),这里用strlen(str1)+1足够
  unsigned long str2[strlen(str1) + 1];

  // 直接传数组名,数组名会退化为指向第一个元素的指针
  int k = strsplit(str1, str2);

  for (int i = 0; i < k; i++)
  {
    printf("%lu\n", str2[i]);
  }

  return 0;
}

int strsplit(char *s, unsigned long *n)
{
  int word_count = 0;
  // 初始化temp数组为全空字符,避免垃圾值干扰
  char temp[50] = {0};
  char *t = temp;

  while (1)
  {
    if (*s == ' ' || *s == '\0')
    {
      // 因为temp初始化为全\0,填充字符后后面的\0还在,strlen能正确计算长度
      *n = strlen(temp);
      n++;
      word_count++;
      
      // 重置t到temp起始位置,不需要清空数组,下次填充会覆盖前面的内容
      t = temp;
      
      if (*s == '\0')
        break;
    }
    else
    {
      *t = *s;
      t++;
      // 手动添加终止符,避免temp填满50个字符后没有终止符的极端情况
      *t = '\0';
    }

    s++;
  }
  return word_count;
}

修复说明

  • 初始化temp为{0},让数组所有元素默认是\0,这样strlen能准确计算已填充字符的长度。
  • 去掉冗余的strprint和empty_arr函数,temp初始化后只需重置指针t即可,下次填充会覆盖前面的内容。
  • 修正参数传递方式,直接传数组名,符合函数参数的类型要求。
  • 在填充字符后给t的下一个位置设\0,避免temp被填满后没有终止符的极端情况。

测试结果

当输入为"help me out man"时,输出会变为:

4
2
3
3

完全符合预期。

内容的提问来源于stack exchange,提问作者user18310766

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:31:02