在vs2013环境下:写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符;编译结果不一致?

尼古拉斯罗本 2015-05-21 09:51:39
在vs2013环境下:
问题:写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符;、
出现问题:这是课后题,按照课后题答案敲上去,编译成功,调试出的结果缺错误,对比原代码没有发现不一样;
并且用代步调试我还是看不出端倪,不懂单步调试的单步结果对我的理解有什么实质上的帮助?
如图所示:

求各位大神帮助
...全文
509 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
布拉格曼 2015-05-23
  • 打赏
  • 举报
回复
引用 10 楼 yangyunzhao 的回复:
不建议用_s的函数,可能带来移植性问题
是的,10楼的考虑很周到,如果是这样的话,考虑到移植性,可以自己封装个scanf_s函数就好办了,同步关掉告警, 哈哈
yangyunzhao 2015-05-23
  • 打赏
  • 举报
回复
不建议用_s的函数,可能带来移植性问题
尼古拉斯罗本 2015-05-23
  • 打赏
  • 举报
回复
引用 7 楼 yaojuntong77 的回复:
建议你弄个头文件,把要关闭的告警全收集起来,然后在需要屏蔽这些告警的地方,把这个头文件包含进去,就省了打字的麻烦 比如说你定义的数组是10个元素上限,由于不带_s的函数不检测上界,这个嘛就 哈哈哈哈…… BUG很严重,BOSS很生气的 所以会有这些_s函数的诞生
哦哈哈,原来酱紫。 既然有警告那就不需要屏蔽了哇,要是屏蔽了不就出问题了还不知道了么
布拉格曼 2015-05-23
  • 打赏
  • 举报
回复
直接上修改后的代码给你吧:


#include <stdio.h>
#include <string.h>

#define MAX_STR_LEN 100

char * InvertStr(char * const pStr);

void main(void)
{
char str[MAX_STR_LEN] = {'\0'};

printf("Please input a string without any blank space key: ");
fflush(NULL);
scanf_s("%s", str, MAX_STR_LEN);
printf("Before invert: %s\n", str);
printf("After invert : %s\n", InvertStr(str));
putchar('\n');
}

char * InvertStr(char * const pStr)
{
char tmpChar;
size_t StrLength = strlen(pStr);
size_t i;

for (i=0; i<StrLength/2; i++)
{
tmpChar = pStr[i];
pStr[i] = pStr[StrLength-i-1];
pStr[StrLength-i-1] = tmpChar;
}
return pStr;
}



这个是我刚刚编译通过的
布拉格曼 2015-05-23
  • 打赏
  • 举报
回复
建议你弄个头文件,把要关闭的告警全收集起来,然后在需要屏蔽这些告警的地方,把这个头文件包含进去,就省了打字的麻烦 比如说你定义的数组是10个元素上限,由于不带_s的函数不检测上界,这个嘛就 哈哈哈哈…… BUG很严重,BOSS很生气的 所以会有这些_s函数的诞生
尼古拉斯罗本 2015-05-23
  • 打赏
  • 举报
回复
引用 5 楼 yaojuntong77 的回复:
简单的说: 1、在VisualStudio2005之前的开发环境中,比如VC++6.0环境,使用了早期的库文件,所以默许scanf函数为安全函数; 2、在VisualStudio2005开始的新IDE环境中,考虑到scanf的不安全性,用scanf_s函数进行替换,然后对用户使用scanf函数进行告警性提示; 3、如果你想用安全的代码,建议用scanf_s,如果非要用scanf也可以,但是会告警,屏蔽告警的方法如下:

// 在调用到scanf函数的文件的第一行,加入如下代码:
#pragma warning(disable: 4996)
谢谢!除了sacnf函数,还是gets函数等,都要用相应_s函数替代,并且要加上参数具体值限制,否则会溢出怎么样的,这其中的原理我不是太清楚,请大神给讲讲哇~
布拉格曼 2015-05-23
  • 打赏
  • 举报
回复
简单的说: 1、在VisualStudio2005之前的开发环境中,比如VC++6.0环境,使用了早期的库文件,所以默许scanf函数为安全函数; 2、在VisualStudio2005开始的新IDE环境中,考虑到scanf的不安全性,用scanf_s函数进行替换,然后对用户使用scanf函数进行告警性提示; 3、如果你想用安全的代码,建议用scanf_s,如果非要用scanf也可以,但是会告警,屏蔽告警的方法如下:

// 在调用到scanf函数的文件的第一行,加入如下代码:
#pragma warning(disable: 4996)
尼古拉斯罗本 2015-05-22
  • 打赏
  • 举报
回复
引用 2 楼 iyomumx 的回复:
用scanf并关闭sdl选项,或者 scanf_s("%s", str, 100);
哦,对,我又把这事给忘了,每次换成了sacnf_s,后面的字符串数量限制还是老是忘,不知道这其中的奥妙在哪里? 另外,请教大神:sdl选项是什么东东,怎么关闭?
尼古拉斯罗本 2015-05-22
  • 打赏
  • 举报
回复
引用 1 楼 yiyefangzhou24 的回复:
char str1[2048]="hello";
char str[2048]={0};
for(int i=0;i<len;i++)
{
      str[len-i-1]=str1[i];
}
printf("%s\n",str);
啥意思,不明觉厉额?
iyomumx 2015-05-21
  • 打赏
  • 举报
回复
用scanf并关闭sdl选项,或者 scanf_s("%s", str, 100);
yiyefangzhou24 2015-05-21
  • 打赏
  • 举报
回复
char str1[2048]="hello";
char str[2048]={0};
for(int i=0;i<len;i++)
{
      str[len-i-1]=str1[i];
}
printf("%s\n",str);

69,373

社区成员

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

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