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

如何使用sscanf读取多单词并按奇偶位置存入不同数组

正确实现方案

首先明确原有代码的两处核心错误:

  • char string[20][12]是二维字符数组,无法直接赋值整段字符串常量,原始的连续单词串需要存储在一维字符数组中。
  • sscanf的传参规则错误,缺少格式控制符指定匹配规则,同时没有记录读取偏移量,会导致每次都从字符串开头重复读取。

可运行的实现代码

#include <stdio.h>

int main() {
    // 原始单词串存储在一维字符数组中
    char str[] = "abcde bagfghabc cdfaga dnac eafagac cnaacaacaf";
    char odd[3][12];  // 存储第1、3、5个单词(从1开始计数的奇数位)
    char even[3][12]; // 存储第2、4、6个单词(从1开始计数的偶数位)
    char *cur_pos = str; // 记录当前读取的起始位置
    int read_offset; // 记录单次读取消耗的字节数
    int i = 0;

    while (i < 3) {
        // %11s 限制单次最多读11个字符,留1位存结束符\0,避免溢出12字节的缓冲区
        // %n 会把本次读取消耗的字节数写入read_offset变量
        sscanf(cur_pos, "%11s %11s%n", odd[i], even[i], &read_offset);
        // 读取指针后移,下次从剩余字符串开始匹配
        cur_pos += read_offset;
        i++;
    }

    // 测试输出验证结果
    printf("奇数位单词:\n");
    for (int j = 0; j < 3; j++) {
        printf("%s\n", odd[j]);
    }
    printf("\n偶数位单词:\n");
    for (int j = 0; j < 3; j++) {
        printf("%s\n", even[j]);
    }
    return 0;
}

补充说明

  • 如果原始字符串的单词数量不是偶数,可以通过判断sscanf的返回值处理边界场景,比如最后只剩1个奇数位单词时,避免读取无效内容。
  • 长度限制%11s必须和缓冲区大小匹配,是C语言字符串操作中防范缓冲区溢出的通用做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:15:09