我用C写的这个字符串反转器出了什么问题?

时间:2018-01-15 22:14:52

标签: c arrays string reverse

我已经看到类似的事情(变量的变化)有效,但是这个人不能告诉我为什么? 这是代码:

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

int main(){
    int i,j,k;
    char str[255],rvrs[255];

    printf("Insert your string: ");
    gets(str);

    i=strlen(str);
    k=i;

    for(j=0;j<=i;j++,k--){
        rvrs[k]=str[j];
    }

    printf("%s",rvrs);
}

3 个答案:

答案 0 :(得分:3)

在循环的最后一次迭代中,j等于istr[i]是空字符(str[0]str[i-1]是字符串中的i非空字符)。因此,在最后一次迭代中,rvrs[k]被设置为空字符。而且,此时k为零。因此,rvrs包含一个空字符串(一个字符串,其中空字符是第一个字符,因此字符串以非空字符结尾)。

要解决此问题,您需要修改代码:

  • 首先,将rvrs[i]设置为零,以便它会在您希望的位置终止。

  • 其次,修改循环以将元素从0正确地反转到i-1,而不是从0i。这样做时要小心确保k具有适当的值。

答案 1 :(得分:0)

使用j<=strlen(str),您可以反转字符串,包括字符串终止符。因此,rvrs的第一个字符将是字符串终止字符,这意味着rvrs将/表现为“空”字符串。

相反,您需要撤销indizes 0..strlen(str)-1之间的所有内容,并且应该在rvrs位置终止rvrs[strlen(str)]='\0'

BTW:请注意,gets已过时/已弃用。请改用fgets

答案 2 :(得分:0)

对于根据C标准的初学者,不带参数的函数main应声明为

int main( void )

函数gets不安全,不再受C标准支持。例如,使用标准函数fgets

j等于istrlen(str)等于str[j]时,rvrs等于&#39; \ 0&#39;。也就是说,终止零写在数组rvrs[k]=str[j];

的开头
strlen

没有意义。

考虑到函数size_t的返回类型int而不是#include <stdio.h> #include <string.h> #define N 255 int main(void) { char str[N], rvrs[N]; str[0] = '\0'; printf("Insert your string: "); fgets( str, sizeof( str ), stdin ); size_t n = strcspn( str, "\n" ); for ( size_t j = 0; j != n; j++ ) { rvrs[j] = str[n - j - 1]; } rvrs[n] = '\0'; puts( rvrs ); return 0; }

程序可以按以下方式查看

Insert your string: Hello David Machado
odahcaM divaD olleH

其输出可能是

<div class="Tabs">
  <ul>
     <li id="tab1" class="Active">Tab 1</li>
     <li id="tab2">Tab 2</li>
     <li id="tab3">Tab 3</li>
  </ul>
</div>

<div id="tab1-content" class="Tab" style="display:none">
  <p>Tab 1 Content</p>
</div>

<div id="tab2-content" class="Tab" style="display:none">
  <p>Tab 2 Content</p>
</div>

<div id="tab3-content" class="Tab" style="display:none">
  <p>Tab 3 Content</p>
</div>
<script>
$(document).ready(function () {
    if ($('li #tab1 .active')) {
        $('#tab1-content').show();
    }
});

$('#tab1').click(function () {
 $('#tab1-content').prev().hide();
    $('#tab1-content').show();
});

 $('#tab2').click(function () {
 $('#tab2-content').prev().hide();
    $('#tab2-content').show();

});

 $('#tab3').click(function () {
  $('#tab3-content').prev().hide();
    $('#tab3-content').show();

});
</script>