1

嘿!我被困在一个ANSI C问题上,我认为这应该是微不足道的(至少在任何现代语言中都是这样:/)。

我的脚本的(临时)目标是将代表时间戳分钟:秒(对于音频文件,因此可以有 120 分钟)的 6 个字符(“123:45”)的字符串(字符数组)拆分为分钟和几秒钟。

我尝试了几种方法——一种是寻找“:”的通用方法,另一种是硬编码的,只是通过索引分割字符串,但似乎没有一种方法有效。

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。这有什么问题?

4

7 回答 7

6

怎么用sscanf()。尽可能简单。

    char time[] = "123:45";
    int minutes, seconds;

    sscanf(time, "%d:%d", &minutes, &seconds);

如果您可以确定时间字符串语法始终有效,则此方法效果最佳。否则,您必须为此添加检查。成功时, sscanf 函数返回成功读取的项目数,因此也很容易检测错误。

工作示例:http: //ideone.com/vVoBI

于 2011-04-20T16:22:48.187 回答
2

怎么样...

int seconds, minutes;
minutes = atoi(instr);
while(*instr != ':' && *++instr != '\0');
seconds = atoi(instr);

应该很快。

于 2011-04-20T16:06:34.447 回答
1

你基本上有三个选择

  • 更改输入字符串(不能是字符串文字)
  • 将数据复制到输出字符串(输入可以是文字)
  • 将字符序列转换为数字

更改输入字符串意味着使用嵌入的 null转换"123:45"为。"123\0" "45"

复制数据意味着管理副本的存储。

例如,转换字符序列意味着使用strtol.

于 2011-04-20T16:07:21.700 回答
1

您没有在 temp[] 中的字符串上放置终止 null,因此当您执行 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 和 outstr 中有效长度的各种检查。

于 2011-04-20T16:10:58.353 回答
1

这个?

char *mins, *secs;
mins = str;
while(*(++str) != ':');
str[0] = '\0';
secs = s + 1;
于 2011-04-20T16:15:31.030 回答
1

这是一种方法,我忽略了上面的“索引”参数:

#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';
        }
}
于 2011-04-20T16:21:58.023 回答
1

你可以尝试这样的事情:

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 ) ;
}
于 2011-04-20T16:06:48.337 回答