user-0 提问: 用指针方法处理“输入三个字符串，按由小到大的顺序输出”，编译结果出现异常

回复:
user: user-1
content: 没用_s安全函数的代码没有错啊，是对的，你要我怎么解释对的程序是为什么对的？

user: user-0
content: 引用 27 楼 lgbxyz 的回复:没用_s安全函数的代码没有错啊，是对的，你要我怎么解释对的程序是为什么对的？ 恩恩，了解是对的，就是按说在12版本里也应该用_s

user: user-2
content: 这个范围是最大范围，大过了数组的，数组就越界了

user: user-2
content: 本身数组申请的是20个，而其他的操作长度都是100，所以越界了

user: user-0
content: 引用 25 楼 lgbxyz 的回复:？你希望有什么问题 就是原因SHISHENM?

user: user-1
content: ？你希望有什么问题

user: user-0
content: 引用 22 楼 lgbxyz 的回复:微软定义的安全型字符串拷贝函数strcpy_s的定义就是这样的啊  errno_t strcpy_s(    char *strDestination,    size_t numberOfElements,    const char *strSource  );  https://msdn.microsoft.com/en-us/library/td1esda9(VS.80).aspx  你的写的参数顺序是linux下的安全型字符串拷贝函数strncpy的顺序  char *strncpy(char *dest, const char *src, size_t n);  好吧，多谢多谢，这个安全函数还是蛮让人头疼的啊~ 以前都是遇到的scanf_s gets_s什么的，直接在后面加了，这个就不行了~  但是为啥我把所有的安全函数去了，参数也去了，在vs2012的环境下运行没问题呢？

user: user-3
content: 话说交换指针不需要用strcpy。。。

user: user-1
content: 微软定义的安全型字符串拷贝函数strcpy_s的定义就是这样的啊  errno_t strcpy_s(    char *strDestination,    size_t numberOfElements,    const char *strSource  );  https://msdn.microsoft.com/en-us/library/td1esda9(VS.80).aspx  你的写的参数顺序是linux下的安全型字符串拷贝函数strncpy的顺序  char *strncpy(char *dest, const char *src, size_t n);

user: user-0
content: 引用 20 楼 lgbxyz 的回复:因为strcpy_s你用错了，参数写反了  #include<stdio.h> #include<string.h>  void swap(char*, char*);  int main(void) { 	char str1[40], str2[40], str3[40]; 	printf("input three line:\n"); 	gets_s(str1, 40); 	gets_s(str2, 40); 	gets_s(str3, 40); 	if (strcmp(str1, str2) > 0) 		swap(str1, str2); 	if (strcmp(str1, str3) > 0) 		swap(str1, str3); 	if (strcmp(str2, str3) > 0) 		swap(str2, str3); 	printf("Now,the order is:\n"); 	printf("%s\n%s\n%s\n", str1, str2, str3); }  void swap(char *p1, char *p2) { 	char p[40]; 	strcpy_s(p, 40, p1); 	strcpy_s(p, 40, p2); 	strcpy_s(p2, 40, p); }  可以了~终于解决了~，为什么这个函数缓冲参数（不知道是不是这样叫，还不太明白，麻烦讲一下）要写在这里？

user: user-1
content: 因为strcpy_s你用错了，参数写反了  #include<stdio.h> #include<string.h>  void swap(char*, char*);  int main(void) { 	char str1[40], str2[40], str3[40]; 	printf("input three line:\n"); 	gets_s(str1, 40); 	gets_s(str2, 40); 	gets_s(str3, 40); 	if (strcmp(str1, str2) > 0) 		swap(str1, str2); 	if (strcmp(str1, str3) > 0) 		swap(str1, str3); 	if (strcmp(str2, str3) > 0) 		swap(str2, str3); 	printf("Now,the order is:\n"); 	printf("%s\n%s\n%s\n", str1, str2, str3); }  void swap(char *p1, char *p2) { 	char p[40]; 	strcpy_s(p, 40, p1); 	strcpy_s(p, 40, p2); 	strcpy_s(p2, 40, p); }

user: user-0
content: #include<stdio.h> #include<string.h> void main() { 	void swap(char*, char*); 	char str1[40], str2[40], str3[40]; 	printf("input three line:\n"); 	gets(str1); 	gets(str2); 	gets(str3); 	if (strcmp(str1, str2) > 0) 		swap(str1, str2); 	if (strcmp(str1, str3) > 0) 		swap(str1, str3); 	if (strcmp(str2, str3) > 0) 		swap(str2, str3); 	printf("Now,the order is:\n"); 	printf("%s\n%s\n%s\n", str1, str2, str3); }  void swap(char *p1, char *p2) { 	char p[40]; 	strcpy(p, p1); 	strcpy(p1, p2); 	strcpy(p2, p); }  原代码不设参数及参数范围情况下，在同学电脑xs2012环境下编译运行通过~ 我的环境是vs2013，给跪了。

user: user-0
content: 引用 12 楼 user-4 的回复:楼主为什么不试试改变一下“缓冲区”的大小试试呢？  修改了，修改了后面的参数改了很多次，都不行~

user: user-0
content: 引用 16 楼 u013115964 的回复:或者你把STR 加大加到200 ，还有Q 也要加大  还是出错，也是醉了。~ 不过去掉_s及后面的缓冲参数，用vs2012编译不报错~，运行成功，见鬼了

user: user-2
content: 或者你把STR 加大加到200 ，还有Q 也要加大

user: user-2
content: 改成比你的str都还小的

user: user-2
content: 所有的你都改成10

user: user-0
content: 引用 10 楼 u013115964 的回复:gets_s 的参数是100 就是可以接受100个字符，你把100个字符给空间只有20的数组，这还不越界？ 你把100 改成10 ，你看还当不当  改成比40小的，10,20,30,39，都不行~

user: user-4
content: 楼主为什么不试试改变一下“缓冲区”的大小试试呢？

user: user-2
content: char str[20]; 	gets_s(str,10);  	char str[20]; 	gets_s(str,100); 我试过，不信你自己测试下，就知道了