user-0 提问: c语言 strcat()函数

回复:
user: user-1
content: http://www.cplusplus.com/reference/cstring/strcat/?kw=strcat

user: user-2
content: 小心驶得万年船！ #include <stdio.h> #include <string.h> #include <locale.h> int main() {     char receive_date[11];     char str_t[5];     char str_m[3],str_d[3];      setlocale(LC_ALL,"chs");      printf(" \n请输入年份（yyyy）： ");fflush(stdout);     rewind(stdin);scanf("%4s",receive_date);      printf(" \n请输入收文日期的月、日（mmdd）： ");fflush(stdout);     rewind(stdin);scanf("%4s",str_t);      strncpy(str_m,str_t  ,2);str_m[2]=0;     strncpy(str_d,str_t+2,2);str_d[2]=0;     strncat(receive_date,"-"  ,10-strlen(receive_date));     strncat(receive_date,str_m,10-strlen(receive_date));     strncat(receive_date,"-"  ,10-strlen(receive_date));     strncat(receive_date,str_d,10-strlen(receive_date));      printf("[%s]\n",receive_date);      return 0; } // //请输入年份（yyyy）： 12345678 // //请输入收文日期的月、日（mmdd）： abcdefgh //[1234-ab-cd] //  如果想校验输入年月日的合法性，参考下面： #include <afxdisp.h> #include <stdio.h> COleDateTime t; int main(int argc, char **argv) {     if (argc<2) {         printf("Usage:%s \"DateTimeStr\"\n",argv[0]);         return 2;     }     if (t.ParseDateTime(argv[1])) {         printf("\"%s\" is a valid DateTimeStr.\n",argv[1]);         printf("%s\n",t.Format("%Y-%m-%d %H:%M:%S"));         return 0;     } else {         printf("\"%s\" is a INVALID DateTimeStr!\n",argv[1]);         return 1;     } }

user: user-0
content: printf("\n%c",receive_date[0]);	 	      printf("\n%c",receive_date[1]); 	      printf("\n%c",receive_date[2]);  	      printf("\n%c",receive_date[3]); 	      printf("\n%c",receive_date[4]); 	      printf("\n%c",receive_date[5]);   	      printf("\n%c",receive_date[6]);	  		  		   	      printf("\n%c",receive_date[7]); 	      printf("\n%c",receive_date[8]); 	      printf("\n%c",receive_date[9]); 	      printf("\n%c",receive_date[10]); 	      printf("\n%c",receive_date[11]);               printf("\n%c",receive_date[12]);        	      printf("\n%c",receive_date[13]); 按paschen 给出的代码，最后用以上语句显示的结果是："2000-08-12a 1a"， 在末尾仍多出4 个字符：“a 1a”。 如果不用strcat函数，改用例如 receive_date[4]='-'; receive_date[5]=str_m[0]; ...... 这样的赋值语句，结果还是多出4 个字符。

user: user-3
content: 缓冲区不够并且没有初始化 试试把下列代码  char receive_date[10]; char str_t[4]; char str_m[2],str_d[2];   改为   char receive_date[16] = {0}; char str_t[8] = {0}; char str_m[4] = {0},str_d[4] = {0};

user: user-2
content: 为什么不改用strncat呢？

user: user-4
content: 这样改吧：   	char receive_date[11]={0}; 	char str_t[4]; 	char str_m[3]={0},str_d[3]={0}; 	strcat(receive_date,"-");  	printf(" \n请输入年份（yyyy）： ");              		scanf("%s",&receive_date);  	printf(" \n请输入收文日期的月、日（mmdd）： ");      		scanf("%s",str_t);  	strncpy(str_m,str_t,2); 	strncpy(str_d,str_t+2,2);  	strcat(receive_date,"-"); 	strcat(receive_date,str_m); 	strcat(receive_date,"-"); 	strcat(receive_date,str_d);

user: user-4
content: 因为strcat操作的是要以\0结尾的字符串，你的str_m与str_d并没有与\0结尾  char str_m[2],str_d[2];  改成 char str_m[3],str_d[3];  然后在strncpy之后将最后一个字符设置成\0

user: user-0
content: 多分配一个字符存储'\0',结果也完全一样。 似乎是每执行一次strcat就要在后面增加一个(不显示)的"\0"。执行4次增加了4个"\0",有多余3个。怎么避免或去掉多余的"\0"?

user: user-5
content: 注意，strxxx都是字符串操作的函数，函数要求它的参数都是字符串，即： 都是以'\0'结尾的。 '\0’是这类函数处理参数的结束标志。

user: user-6
content: 要多分配一个字符存储'\0'表示字符串结束