我的脚本的(临时)目标是分割一个6个字符(“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.这有什么问题?
答案 0 :(得分:6)
如何使用sscanf()
。尽可能简单。
char time[] = "123:45";
int minutes, seconds;
sscanf(time, "%d:%d", &minutes, &seconds);
如果您可以确定时间字符串语法始终有效,则此方法效果最佳。否则你必须添加检查。成功时,sscanf函数返回成功读取的项目数,因此检测错误也很容易。
答案 1 :(得分:1)
怎么样......
int seconds, minutes;
minutes = atoi(instr);
while(*instr != ':' && *++instr != '\0');
seconds = atoi(instr);
应该很快。
答案 2 :(得分:0)
你可以尝试这样的事情:
void break_string(const char* input, char* hours, char* minutes)
{
if(input == 0 || hours == 0 || minutes == 0)
return;
while(*input != ':')
*hours++ = *input++;
*hours = '\0';
++input;
while(*minutes++ = *input++);
return;
}
这是一个简化的相同功能:
void break_string(const char* input, char* hours, char* minutes)
{
if(input == 0 || hours == 0 || minutes == 0)
return;
while(*input != ':')
{
*hours = *input;
++hours;
++input;
}
*hours = '\0';
++input; //ignore the ':' part
while(*input)
{
*minutes = *input;
++minutes;
++input;
}
*minutes = '\0';
return;
}
int main()
{
char* test = "123:45";
char* minutes = malloc( sizeof(char) * 12 );
char* hours = malloc( sizeof(char) * 12 );
break_string( test , hours , minutes );
printf("%s , %s \n" , hours , minutes );
//...
free( minutes );
free( hours ) ;
}
答案 3 :(得分:0)
你基本上有三个选择
更改输入字符串意味着使用嵌入的null将"123:45"
转换为"123\0" "45"
。
复制数据意味着管理副本的存储空间。
转换字符序列意味着使用例如strtol
。
答案 4 :(得分:0)
你没有在temp []中对字符串设置终止空值,所以当你执行strlen(temp)时,你正在访问任意内存。
使用已知长度,您可以使用以下内容:
char temp[4];
if (index==0)
{
strncpy(temp, instr, 3);
temp[3] = 0;
}
else if (index==1)
{
strncpy(temp, instr+4, 2);
temp[2] = 0;
}
strcpy(outstr, temp);
但是,我会提醒我,我已经在instr和outtr中跳过各种有效长度的检查。
答案 5 :(得分:0)
此?
char *mins, *secs;
mins = str;
while(*(++str) != ':');
str[0] = '\0';
secs = s + 1;
答案 6 :(得分:0)
这是一种方法,我忽略了上面的“索引”参数:
#include <stdio.h>
#include <string.h>
void _splitstr ( char *instr, char *outstr ) {
char temp[10];
char* end = strchr(instr, ':');
int i = 0;
if(end != 0) {
while(instr != end)
temp[i++] = *instr++;
temp[i] = '\0';
strcpy(outstr, temp);
} else {
outstr = '\0';
}
}