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

尼古拉斯罗本 2015-07-15 11:45:40
用指针方法处理“输入三个字符串,按由小到大的顺序输出”,编译结果出现异常
如图所示,求各位大神解决~


...全文
656 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
LubinLew 2015-07-17
  • 打赏
  • 举报
回复
没用_s安全函数的代码没有错啊,是对的,你要我怎么解释对的程序是为什么对的?
尼古拉斯罗本 2015-07-17
  • 打赏
  • 举报
回复
引用 27 楼 lgbxyz 的回复:
没用_s安全函数的代码没有错啊,是对的,你要我怎么解释对的程序是为什么对的?
恩恩,了解是对的,就是按说在12版本里也应该用_s
愛德华 2015-07-16
  • 打赏
  • 举报
回复
这个范围是最大范围,大过了数组的,数组就越界了
愛德华 2015-07-16
  • 打赏
  • 举报
回复
本身数组申请的是20个,而其他的操作长度都是100,所以越界了
尼古拉斯罗本 2015-07-16
  • 打赏
  • 举报
回复
引用 25 楼 lgbxyz 的回复:
?你希望有什么问题
就是原因SHISHENM?
LubinLew 2015-07-16
  • 打赏
  • 举报
回复
?你希望有什么问题
尼古拉斯罗本 2015-07-16
  • 打赏
  • 举报
回复
引用 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的环境下运行没问题呢?
solashrio 2015-07-16
  • 打赏
  • 举报
回复
话说交换指针不需要用strcpy。。。
LubinLew 2015-07-16
  • 打赏
  • 举报
回复
微软定义的安全型字符串拷贝函数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);
尼古拉斯罗本 2015-07-16
  • 打赏
  • 举报
回复
引用 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);
}
可以了~终于解决了~,为什么这个函数缓冲参数(不知道是不是这样叫,还不太明白,麻烦讲一下)要写在这里?
LubinLew 2015-07-16
  • 打赏
  • 举报
回复
因为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);
}
尼古拉斯罗本 2015-07-16
  • 打赏
  • 举报
回复
#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,给跪了。
尼古拉斯罗本 2015-07-16
  • 打赏
  • 举报
回复
引用 12 楼 king191923157 的回复:
楼主为什么不试试改变一下“缓冲区”的大小试试呢?
修改了,修改了后面的参数改了很多次,都不行~
尼古拉斯罗本 2015-07-16
  • 打赏
  • 举报
回复
引用 16 楼 u013115964 的回复:
或者你把STR 加大加到200 ,还有Q 也要加大
还是出错,也是醉了。~ 不过去掉_s及后面的缓冲参数,用vs2012编译不报错~,运行成功,见鬼了
愛德华 2015-07-16
  • 打赏
  • 举报
回复
或者你把STR 加大加到200 ,还有Q 也要加大
愛德华 2015-07-16
  • 打赏
  • 举报
回复
改成比你的str都还小的
愛德华 2015-07-16
  • 打赏
  • 举报
回复
所有的你都改成10
尼古拉斯罗本 2015-07-16
  • 打赏
  • 举报
回复
引用 10 楼 u013115964 的回复:
gets_s 的参数是100 就是可以接受100个字符,你把100个字符给空间只有20的数组,这还不越界? 你把100 改成10 ,你看还当不当
改成比40小的,10,20,30,39,都不行~
king191923157 2015-07-16
  • 打赏
  • 举报
回复
楼主为什么不试试改变一下“缓冲区”的大小试试呢?
愛德华 2015-07-16
  • 打赏
  • 举报
回复
char str[20]; gets_s(str,10); char str[20]; gets_s(str,100); 我试过,不信你自己测试下,就知道了
加载更多回复(8)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧