【问题标题】:Reversing a string in C using a for loop?使用for循环反转C中的字符串?
【发布时间】:2021-11-11 12:52:02
【问题描述】:

我一直在尝试尽可能简单地反转字符串,试图向自己证明一点,但由于某种原因,代码无法正常工作。我知道我可以很容易地在网上找到一种不同的方法,但是我什么也学不到。那么有人能解释一下吗?

#include <stdio.h>
#include <stdlib.h>

int main()
{   int i,n,c=0;
    char s[50];
    char a[50];
    for(i = 0; i < 50;i++)
        scanf("%[^\n]c",&s[i]);
    for(n = strlen(s), i = 0; n > i; n--,c++)
        s[c] = s[n-1];

    printf("%s", s);
    return 0;
}

【问题讨论】:

  • edit 并定义“不工作”。阅读:How to Ask
  • 为什么要逐个字符地扫描输入? AFAICT 当您这样做时,您的 s 缓冲区不是 NUL 终止的,这将导致 strlen() 表现出未定义的行为。
  • 提示:拿一张纸,剪成4段,在4张纸上分别写上字母A到D。把它们放在一张桌子上,这样它们就形成了“ABCD”这个词。现在应用您的算法,您会发现问题所在。
  • 它反转到一半,然后打印出常规文本......我试图理解它为什么这样做?
  • 好吧,我明白了......但是该死的,这真的很混乱

标签: c loops for-loop reverse c-strings


【解决方案1】:

对于初学者,您需要包含标题&lt;string.h&gt;

这个循环

for(i = 0; i < 50;i++)
    scanf("%[^\n]c",&s[i]);

意义不大。此外,您需要在输入的字符串后面加上终止零字符'\0'

例如,你需要输入一个字符串一次

scanf("%49s", s );

或者写得更好

scanf( "%49[^\n]", s );

在数组中输入一个包含多个单词的字符串。

这个for循环

for(n = strlen(s), i = 0; n > i; n--,c++)
    s[c] = s[n-1];

也没有意义。它不会反转字符串。变量 i 没有增加。那就是你需要交换两个字符。

您还需要在使用它们的最小范围内声明变量。

循环可以如下所示

for ( size_t i = 0, n = strlen(s); i < n / 2; i++ )
{
    char c = s[i];
    s[i] = s[n-1-i];
    s[n-1-i] = c;
}

除此之外,声明的数组a 没有在程序中使用。

所以程序可以如下所示

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

int main( void )
{
    char s[50] = "";
 
    scanf( "%49[^\n]", s );

    for ( size_t i = 0, n = strlen(s); i < n / 2; i++ )
    {
        char c = s[i];
        s[i] = s[n-1-i];
        s[n-1-i] = c;
    }

    puts( s );
}

如果要输入字符串

Hello, unikatura!

那么程序输出将是

!arutakinu ,olleH

【讨论】:

    【解决方案2】:
    1. 使用函数。

    两种变体:

    char *reverse(char *str)
    {
        char *end = str, *start = str;
    
        if(str && *str)
        {
            for(;*(end + 1);end++);
            for(;end > start;)
            {
                char tmp = *end;
                *end-- = *start;
                *start++ = tmp;
            }
        }
        return str;
    }
    
    
    char *reverse1(char *dest, const char *str)
    {
        char *wrk = dest;
        size_t len = 0;
    
        if(str)
        {
            for(;*str;len++, str++);str -= !!*str;
            for(;len--; *wrk++ = *str--);
        }
        *wrk = 0;
        return dest;
    }
    
    

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 2021-10-28
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      相关资源
      最近更新 更多