仅使用For循环反转字符串

时间:2019-11-20 08:14:30

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

我一直在尝试反转(并以这种方式打印)给定的字符串仅使用for循环仅此。我认为我已经建立了基本逻辑,但是它有一些缺陷。运行时,它只反转前两个字符,然后停止。请帮助我找出我逻辑上的缺陷。

#include<stdio.h>
#include<stdlib.h>
int main()
{
    char a[20];
    int i;
    printf("Enter any String\n");
    gets(a);
    for(i=0;a[i]!=NULL;i++)
    {}
    for(i=1;i>=0;i--)
    {
        printf("%c",a[i]);
    }
}

4 个答案:

答案 0 :(得分:4)

对于初学者来说,功能gets不再是标准的C函数。这是不安全的。而是使用标准的C函数fgets。该函数可以将换行符'\n'附加到应从字符串中排除的输入字符串。

不清楚您的问题是否允许使用标准字符串函数。

尽管如此,这里还是一个演示程序,该程序无需使用标准的C字符串函数即可执行任务,并且仅用于循环(while循环和do-while循环)。

#include <stdio.h>

int main(void) 
{
    enum { N = 20 };
    char s[N];

    printf( "Enter any String less than %d symbols: ", N ); 

    fgets( s, N, stdin );

    //  remove the new line character and calculate the length of the string
    size_t n = 0;
    for ( ; s[n] != '\0' && s[n] != '\n'; ) ++n;

    s[n] = '\0';

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

    puts( s );

    return 0;
}

其输出可能如下所示

Enter any String less than 20 symbols: Hello dev.aniruddha
ahddurina.ved olleH

如果您只想以相反的顺序输出原始字符串,那么程序可以看起来像

#include <stdio.h>

int main(void) 
{
    enum { N = 20 };
    char s[N];

    printf( "Enter any String less than %d symbols: ", N ); 

    fgets( s, N, stdin );

    //  remove the new line character and calculate the length of the string
    size_t n = 0;
    for ( ; s[n] != '\0' && s[n] != '\n'; ) ++n;

    s[n] = '\0';

    //  reverse the string

    for ( ; n-- != 0;  )
    {
        putchar( s[n] );
    }

    putchar( '\n' );

    return 0;
}

其输出与上面显示的相同

Enter any String less than 20 symbols: Hello dev.aniruddha
ahddurina.ved olleH

答案 1 :(得分:1)

gets()是一个坏主意,因为您很容易会发生溢出,并且它不再是c标准的一部分。 因此,我们假设输入的字符串适合该数组,而这只是一种练习,没有实际用途。

您的第一个循环找到终止符。很好
您的第二个循环将指示终止符的变量设置为1,破坏了结果。 如果您删除分配i=1,则程序将使用gcc编译并执行您想要的操作。

#include<stdio.h>
#include<stdlib.h>
int main()
{
    char a[20];
    int i;
    printf("Enter any String\n");
    gets(a);
    for(i=0;a[i]!=NULL;i++)
    {}
    for(;i>=0;i--) //removed i=1 here
    {
        printf("%c",a[i]);
    }
}

但是仍然有一些问题需要解决。 您还将反转终止符,而应从i-1开始 如果您没有反条件,我建议不要使用for循环。第一个循环应该是while循环,但是由于它是分配的一部分,您别无选择,所以我仍将其替换建议。因为它们可以轻松交换。

然后为清晰起见,可以在第二个循环中使用另一个变量。 此外,NULL是NULL指针,而不是值0(也相应地命名为NUL)。因此,您应该将其替换为0'\0'

这里也不需要stdlib.h

#include<stdio.h>
int main()
{
    char a[20];
    int i = 0;

    printf("Enter any String\n");
    gets(a);

    while (a[i] != 0)
    {
        i++;
    }

    for(int j = i-1; j>=0; j--) // -1 to get the value in front of the terminator
    {
        printf("%c",a[j]);
    }
    printf("\n"); //to flush the output.
}

答案 2 :(得分:-1)

这是解决方案代码。 第一个for循环用于确定字符串的长度,第二个for循环用于从最后一个位置到第一个位置遍历字符串。

#include<stdio.h>
int main()
{
    char a[20];
    int i,j,len;
    printf("Enter a String\n");
    gets(a);
    for(i=0;a[i]!=NULL;i++)
    {}
    len=i;
    for(j=len-1;j>=0;j--)
    {
        printf("%c",a[j]);
    }

}

答案 3 :(得分:-1)

我认为为什么只返回两个字符是由于第二个“ for循环”中的条件语句。

for(i=1;i>=0;i--) 

注意:

  1. 从1〜0(1,0)重复一次:这意味着它只会重复两次
  2. 第一次迭代:当i == 1
  3. 第二次迭代:当i == 0时;然后它结束了。

请注意,您创建了两个“ for循环”,第一个没有内容。

奖金: 我试图修正您的代码,但意识到我的C语言技能并不是最好的笑话。无论如何,我想出了一些您可以引用的内容,但它只能反转少于8个元素的字符串。

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

int findlength(char a[]);

int main()
{
    char a[20];
    int i;
    printf("Enter any String\n");
    gets(a);
    int len = findlength(a);
    printf("Lenght of the String is: %d \n",len);
    printf("Reversed String is: ");
    for(i=len;i>-1;i--){
        printf("%c",a[i]);
    }

}

int findlength(char a[]){
    int result = 0;
    int i;
    for(i=0;i<sizeof(a) / sizeof(char);i++){ // sizeof(char) is 1 
        if(a[i] == '\0') //end of string
            return result;
        result += 1;
    }
    return result;
}