C - Concat Strings

时间:2013-04-01 02:59:45

标签: c string char concat

尝试使用C连接字符串(* char)并且有很多分段错误:

void printDateFormat( char *in ) { /* begin function printDateFormat */

   char *month;          // month by char
   int month_int;        // month by digit
   char *day;            // day by char
   char *year;           // year by char
   char *dateToken;      // date token in split
   char *formatted;      // formatted string

   dateToken = strtok (in, "/");
   month = &dateToken;

   formatted = formatted = getMonth(month);

   dateToken = strtok (NULL, "/");
   day = &dateToken;

   formatted = strcat (formatted, day);
   formatted = strcat (formatted, ", ");

   dateToken = strtok (NULL, "/");
   year = &dateToken;

   formatted = strcat (formatted, year);

   in = *formatted;

} /* End function printDateFormat */


char *getMonth( int d) { /* begin function *getMonth */

switch (d) {

  case 1:
     return "January";
 //    break;
  case 2:
     return "February";
 //    break;
  case 3:
     return "March";
 //    break;
  case 4:
     return "April";
//     break;
  case 5:
     return "May";
//     break;
  case 6:
     return "June";
//     break;
  case 7:
     return "July";
//     break;
  case 8:
     return "August";
//     break;
  case 9:
     return "September";
//     break;
  case 10:
     return "October";
 //    break;
  case 11:
     return "November";
//     break;
  case 12:
     return "December";
//     break;
   }

} /* End function *getMonth */

输入printDateFormat()需要格式为另一个字符串:MM / dd / yyyy ... ie。 2013年3月31日。目的是将其转化为:2013年3月31日。

编辑:

以下是我如何传入printDateFormat

void option1( void ) { /* begin function option1 */

    char date[10]; /*user input date string */

    printf("\n\nEnter date [Format: MM/dd/yyyy]: ");
    fgets(date, 10, stdin);

    scanf("%s", &date);

    printDateFormat(date);

    printf("\n%s", date);

} /* End function option2 */

编辑2:

好的,做了一些改变,但仍然没有骰子......

这是我的编译器警告:

asgn9.c: In function `printDateFormat':
asgn9.c:224: warning: passing arg 1 of `getMonth' makes integer from pointer without a cast
asgn9.c:237: warning: assignment makes pointer from integer without a cast

他们指的是在getMonth()

中使用printDateFormat()

这是我的更新代码,我仍然在同一地点得到分段错误...

void printDateFormat( char *in ) { /* begin function printDateFormat */

    char *month;          // month by char
    int month_int;        // month by digit
    char *day;            // day by char
    char *year;           // year by char
    char *dateTkn;      // date token in split
    char *formatted;      // formatted string

    dateTkn = strtok (in, "/");
    month = dateTkn;

    formatted = getMonth(month);

    dateTkn = strtok (NULL, "/");
    day = dateTkn;

    formatted = strcat (formatted, day);
    formatted = strcat (formatted, ", ");

    dateTkn = strtok (NULL, "/");
    year = dateTkn;

    formatted = strcat (formatted, year);

    in = *formatted;

} /* End function printDateFormat */

char *getMonth( int d) { /* begin function *getMonth */

    static char *months[] = {"January", "February", "March", "April", "May",
        "June", "July", "August", "September", "October", "November", "December"};

    return strcpy(malloc(32), months[d]);

} /* End function *getMonth */

6 个答案:

答案 0 :(得分:4)

您的getMonth返回指向字符串文字的指针。试图修改它(例如,使用strcat)是不允许的 - 它会导致未定义的行为。

我(强烈)建议使用strftime来处理格式化日期和/或时间字符串以进行打印。这样不仅可以将您的格式代码缩减为单行,还可以在/如果您需要时支持本地化结果。

编辑:如果您无法使用strftime,则需要在自己的缓冲区中构建格式化日期,可能使用sprintf

char buffer[256];
static const char *months[] = {
    "January", 
    "February", 
    /* ... */ , 
    "November", 
    "December"
};

sprintf(buffer, "%s %d %d", months[monthnum], day, year);

答案 1 :(得分:1)

值返回

getMonth(month);

指向常量字符串。您无法修改此字符串,包括strcat()。您可以更改功能以满足您的要求:

char formatted[MAXSIZE];      // formatted string
getMonth(month, formatted);

void getMonth( int d, char *cache) { /* begin function *getMonth */
    switch (d) {
        case 1:
            strcpy(cache, "January");
            return;
        ......
}

之后,您可以继续修改char数组中“格式化”的内容。

答案 2 :(得分:1)

您尚未为格式化分配任何内存。将格式化声明更改为

char formatted[80];

并将第一个分配更改为格式化为

strcpy ( formatted, getMonth ( month ), sizeof ( getMonth ( month ) ) );

你应该没事。

答案 3 :(得分:1)

假设你的帖子是正确的,那么问题就是

month = &dateToken;
....
day = &dateToken;
....
year = &dateToken;

strtok返回char *,所以只需删除&来自每个'dateToken'。 你的'getMonth'输入原型是'int'类型,但你给的函数是'char *'类型, 'switch'表将无法识别非数字表格。

答案 4 :(得分:1)

C不是字符串处理的语言。如果可能,请使用C ++和std :: string。

在C中执行此操作的一种方法是定义一个大char buffer[BUFFERSIZE]缓冲区以将两个字符串复制到其中以便将它们连接起来。小心不要超出缓冲区!

你也可以malloc /释放缓冲区,但那是另一套令人头疼的问题。

答案 5 :(得分:1)

您可以通过以下方式解决一些问题并简化代码:

char *getMonth(int d) {
  static char *months[] = { "January", "February", "March",
    . . .
  };

  return strcpy(malloc(60), months[d]);
}

这样,

  • 返回值是可写的
  • 它为strcat()ops
  • 提供了额外的空间

对于工业强度,您可能需要检查malloc()的返回值,看看n是否在范围内,以及类似的事情。