嘿!我被一个ANSI C问题卡住了,我认为这个问题应该很微不足道(至少在任何现代语言中都是这样:/)。
我的脚本的(临时)目标是将一个6个字符的字符串(char数组)(“123:45”)拆分为分钟和秒,该字符串表示时间戳分钟:秒(对于音频文件,因此可以使用120分钟)。
我尝试了几种方法--一种是查找“:”的通用方法,另一种是只按索引拆分字符串的硬编码方法,但似乎都不起作用。
void _splitstr ( char *instr, int index, char *outstr ) {
char temp[3];
int i;
int strl = strlen ( instr );
if ( index == 0 ) {
for ( i = 0; i < 3; ++i ) {
if ( temp[i] != '\0' ) {
temp[i] = instr[i];
}
}
} else if ( index == 1 ) {
for ( i = 6; i > 3; i-- ) {
temp[i] = instr[i];
}
}
strcpy ( outstr, temp );
}
另一个“有趣”的事情是char[3]的字符串长度是6或9,而实际上从来不是3。这有什么问题吗?
7条答案
按热度按时间jgwigjjp1#
使用
sscanf()
怎么样?尽可能简单。如果你能确保时间字符串语法总是有效的话,这是最好的。否则你必须添加检查。成功时,sscanf函数 * 返回成功读取的项目数量 *,所以它也很容易检测到错误。
工作示例:http://ideone.com/vVoBI
s4chpxco2#
不如...
应该很快
eyh26e7m3#
你基本上有三个选择
更改输入字符串意味着将
"123:45"
转换为"123\0" "45"
并嵌入null。拷贝数据意味着管理拷贝的存储。
转换字符序列意味着使用例如
strtol
。qjp7pelc4#
你没有在temp[]中的字符串上放置一个终止null,所以当你执行strlen(temp)时,你正在访问任意内存。
使用你已知的长度,你可以使用这样的东西:
但是,我要提醒您,我已经跳过了对instr和outstr中有效长度的各种检查。
7kqas0il5#
你可以试试这样的方法
下面是一个简单的函数:
noj0wjuj6#
这个?
ztigrdn87#
这里有一种方法,我忽略了上面的“索引”参数: