C语言中按冒号分隔读取字符串到变量失败,求问题原因
问题原因与解决办法
核心问题
sscanf的%s格式符会匹配所有非空白字符,直到碰到空格、换行或者字符串结尾才停下。你的目标字符串hello:how:23里没有空白字符,所以第一个%s直接把整个字符串都读走了,后面的:%s:%d根本没机会匹配,自然second_wrd是空的,num保持初始的0值。
正确解法
要匹配到冒号为止的字符串,得用扫描集格式符%[^:]——它的意思是“匹配所有不是冒号的字符”。同时格式串里的冒号要和目标字符串里的冒号对应上,保证解析流程能跳过分隔符。
示例代码
#include <stdio.h> int main() { char buf[100]; char first_wrd[20], second_wrd[20]; int num = 0; // 生成目标格式的字符串 snprintf(buf, sizeof(buf), "%s:%s:%d", "hello", "how", 23); // 用扫描集解析,加长度限制避免缓冲区溢出 int match_count = sscanf(buf, "%19[^:]:%19[^:]:%d", first_wrd, second_wrd, &num); if (match_count == 3) { printf("first_wrd: %s\nsecond_wrd: %s\nnum: %d\n", first_wrd, second_wrd, num); } else { printf("解析失败,仅匹配到%d个元素\n", match_count); } return 0; }
注意事项
%19[^:]里的19是安全限制:假设字符数组长度是20,留1个位置给字符串终止符\0,防止输入过长导致缓冲区溢出,这是C代码的基本安全规范。- 格式串里的
:必须和目标字符串的冒号完全对应,这样sscanf才能正确跳过分隔符,读取后面的内容。 - 可以通过
sscanf的返回值判断解析是否成功:返回3就表示三个变量都正确匹配到了内容。
内容的提问来源于stack exchange,提问作者Hipster1206
相关产品推荐
相关产品推荐

