1

ちょっと、そこ!私はANSICの問題に悩まされていますが、これはかなり些細なことだと思います(少なくとも現代語ではそうです:/)。

私のスクリプトの(一時的な)目標は、タイムスタンプの分:秒(オーディオファイルの場合は120分でもかまいません)を表す6文字( "123:45")の文字列(charの配列)を分割することです。分とちょうど秒。

私はいくつかのアプローチを試しました。「:」を探す一般的なアプローチと、文字列をインデックスで分割するだけのハードコードされたアプローチですが、どれも機能しないようです。

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 );
}

もう1つの「面白い」ことは、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

これが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

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

あなたはそのようなことを試すことができます:

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 に答える
1

基本的に3つのオプションがあります

  • 入力文字列を変更します(文字列リテラルにすることはできません)
  • データを出力文字列にコピーします(入力はリテラルにすることができます)
  • 文字のシーケンスを数字に変換する

入力文字列を変更することは、nullが埋め込まれたに変換"123:45"することを意味します。"123\0" "45"

データのコピーは、コピーのストレージを管理することを意味します。

文字のシーケンスを変換することは、たとえば、を使用することを意味しstrtolます。

于 2011-04-20T16:07:21.700 に答える
1

これ?

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