我一直在尝试反转(并以这种方式打印)给定的字符串仅使用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]);
}
}
答案 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--)
注意:
请注意,您创建了两个“ 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;
}