尝试使用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 */
答案 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]);
}
这样,
对于工业强度,您可能需要检查malloc()
的返回值,看看n
是否在范围内,以及类似的事情。