如何使用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
相关产品推荐
相关产品推荐

