老师参与

空串会抛出异常但用例3过不了,下标越界也没法自动捕获异常

澄碧钓徒 发表于2019年07月18日
<p><code class="brush:cpp;toolbar:false" >#include&nbsp;&lt;iostream&gt; #include&nbsp;&lt;exception&gt; #include&nbsp;&lt;cstring&gt; using&nbsp;namespace&nbsp;std; void&nbsp;my_strcpy(char&nbsp;*d,&nbsp;char&nbsp;*s) { int&nbsp;i; for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;strlen(s);&nbsp;i++) if(s[i]&nbsp;==&nbsp;'&nbsp;') &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[i]&nbsp;=&nbsp;'\0'; &nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;strlen(s);&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[i]&nbsp;=&nbsp;s[i]; &nbsp;&nbsp;&nbsp;&nbsp;d[i]&nbsp;=&nbsp;'&nbsp;'; } int&nbsp;main() { string&nbsp;d,&nbsp;s; try{ getline(cin,&nbsp;s); getline(cin,&nbsp;d); char&nbsp;dd[81],&nbsp;ss[81]; strncpy(dd,&nbsp;d.c_str(),&nbsp;d.length()&nbsp;+&nbsp;1);&nbsp;&nbsp;//为什么这里没法主动引发异常? strncpy(ss,&nbsp;s.c_str(),&nbsp;s.length()&nbsp;+&nbsp;1); if(d&nbsp;==&nbsp;&quot;&quot;||s&nbsp;==&nbsp;&quot;&quot;||d.length()&nbsp;&gt;&nbsp;80||s.length()&nbsp;&gt;&nbsp;80) throw&nbsp;exception(); my_strcpy(dd,&nbsp;ss); cout&nbsp;&lt;&lt;&nbsp;dd; }catch(exception&nbsp;e) { cout&nbsp;&lt;&lt;&nbsp;&quot;error&quot;; } }</code></p><p><img src="https://nos.netease.com/edu-image/e145da5ec4a54d4b89f391e3a2dff383.PNG" /></p><p>看到老师在前面一个帖子提示要检查空串,所以我想着判断如果是空串的话就抛出异常(字符数组转字符串不知怎么搞的编译出错,只好这样写了),还有就是第22/23行如果字符数组下标越界为什么也没法主动引发异常直接程序崩溃,还得第24行再判断下长度是否超过80?发现C++对很多异常都不灵敏(包括除零错误都是)?</p>
1 回复

    1楼

  • 戴波老师 发表于2019年07月19日
    0 | 2 | 举报
    <p>空串的判断是函数里面判断,因为是字符指针指向的字符串,所以指针判断空是和NULL判断的</p>
    戴波老师 发表于2019年07月19日
    • 澄碧钓徒 2019年07月19日
      0 | 举报
      <p>老师,在函数体里面用字符指针判断空串用例3还是过不了,而且Dev C++上为什么有警告信息?</p><p><code class="brush:cpp;toolbar:false" >#include&nbsp;&lt;iostream&gt; #include&nbsp;&lt;exception&gt; #include&nbsp;&lt;cstring&gt; using&nbsp;namespace&nbsp;std; void&nbsp;my_strcpy(char&nbsp;*d,&nbsp;char&nbsp;*s) { &nbsp;&nbsp;&nbsp;&nbsp;if(*d&nbsp;==&nbsp;NULL||*s&nbsp;==&nbsp;NULL||strlen(d)&nbsp;&gt;&nbsp;80||strlen(s)&nbsp;&gt;&nbsp;80) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;exception();&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i; &nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;strlen(s);&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(s[i]&nbsp;==&nbsp;'&nbsp;') &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[i]&nbsp;=&nbsp;'\0'; &nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;strlen(s);&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[i]&nbsp;=&nbsp;s[i]; &nbsp;&nbsp;&nbsp;&nbsp;d[i]&nbsp;=&nbsp;'&nbsp;'; } int&nbsp;main() { &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;d[81],&nbsp;s[81]; &nbsp;&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gets(s); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gets(d); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my_strcpy(d,&nbsp;s); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;d; &nbsp;&nbsp;&nbsp;&nbsp;}catch(exception&nbsp;e) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;&quot;error&quot;; &nbsp;&nbsp;&nbsp;&nbsp;} }</code></p><p><img src="https://nos.netease.com/edu-image/fd42649fb9ef48b8bc71e69f41808a2b.PNG" /></p>
      澄碧钓徒 发表于2019年07月19日
      0 | 举报
    • 澄碧钓徒 2019年07月19日
      0 | 举报
      <p>如果把Dev C++设置成C++11标准第7行用nullptr甚至编译错误?<br ></p><p><p><code class="brush:cpp;toolbar:false" >if(*d&nbsp;==&nbsp;nullptr||*s&nbsp;==&nbsp;nullptr||strlen(d)&nbsp;&gt;&nbsp;80||strlen(s)&nbsp;&gt;&nbsp;80)</code></p><p><img src="https://nos.netease.com/edu-image/ea8156deec764356bd1810cc83918bdb.PNG" /></p></p>
      澄碧钓徒 发表于2019年07月19日
      0 | 举报
    添加评论