如何在C中拆分char指针?

hec6srdp  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(123)

我有下面的字符指针字符串“2020年6月6日星期五11:08:04”,我想把它分成以下几部分:
日期= 6月6日星期五
时间= 11:08:04
我尝试实现的代码如下:

#include <stdio.h>
#include <string.h>

int main()
{
    char *message = "Friday 6 June 11:08:04 2020";
    char time_buff[9] = {0};
    char date_buff[13] = {0};

    for(int d=0; d<13; d++){
        date_buff[d] = message[d];
    }

    for(int t=14; t<23; t++){
        time_buff[t] = message[t];
    }

    for(int p=0; p<13; p++){
        printf("%c ", date_buff[p]);
    }

    return 0;
}

当我运行这段代码时,我得到以下错误:

*** stack smashing detected ***: terminated
Aborted (core dumped)

我如何解决这个问题并将字符串拆分为日期和时间部分?

ht4b089n

ht4b089n1#

该方法非常简单,它只适用于这个特定的日期-但即使在这里,您也有2个主要错误
1.您需要空间来容纳空终止字符(您的char数组太小)。
1.复制到错误的索引(第二个循环从14开始,但你想复制到从零开始的索引)

int main(void)
{
    char *message = "Friday 6 June 11:08:04 2020";
    char time_buff[10] = {0};
    char date_buff[14] = {0};

    for(int d=0; d<13; d++){
        date_buff[d] = message[d];
    }

    for(int t=14; t<22; t++){
        time_buff[t - 14] = message[t];
    }

    printf("\"%s\"\n\"%s\"\n", time_buff, date_buff);
    return 0;
}

https://godbolt.org/z/vz34v3h39

csbfibhn

csbfibhn2#

一些小的调整在这里和那里:

  • main的正确形式是int main (void)
  • 良好做法:用常量替换“幻数”。
  • 时间实际上是8个字符。
  • 良好做法:为空终止符分配空间,以生成这些正确的C字符串。
  • 良好做法:总是const限定指向字符串文字的指针。
  • 计算从要复制的位置开始的字符串偏移量。
  • 在每个副本后附加空终止符。
  • (您也可以在这里使用memcpy而不是这些循环。
#include <stdio.h>
#include <string.h>

int main (void)
{
    const char *message = "Friday 6 June 11:08:04 2020";
    const size_t date_size = 13;
    const size_t time_size = 8;
    char date_buff[date_size + 1];
    char time_buff[time_size + 1];
    size_t i;

    for(i=0; i<date_size; i++){
        date_buff[i] = message[i];
    }
    date_buff[i] = '\0';

    size_t time_offset = date_size + 1;
    for(i=0; i<time_size; i++){
        time_buff[i] = message[i + time_offset];
    }
    time_buff[i] = '\0';

    puts(date_buff);
    puts(time_buff);

    return 0;
}

相关问题