在这个程序中,我试图从用户输入一个字符串作为输入,猜测这里字符串的最大长度是40(显然可以超过)。
我找出长度并使用长度动态创建另一个字符数组(仅防止为此数组分配任何随机值),最后,添加最后一个字符以获取反向字符串。
它编译得很好,但在运行时,不提供任何输出。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char word[40];
char *rev;
int i=0;
int l=0;
printf("Enter any statement \n");
scanf("%[^\n]", word);
while(word[i]!='\0')
{
i++;
}
// i contains the length of the string
rev=(char *)malloc(i*sizeof(char));
while(i>0)
{
rev[l]=word[i];
i--;
l++;
}
printf("\n %s", rev);
return 0;
}
答案 0 :(得分:3)
您有两个(至少)问题:第一个问题是您将字符交换两次。第二个问题是您还在交换中包含终止符。
答案 1 :(得分:1)
我相信你有一个'一次性'类型错误,并且没有看到任何输出,因为正在将{teminating \0
字符复制到rev
的第一个位置。
答案 2 :(得分:1)
rev[l]=word[i];
应rev[l]=word[i-1];
答案 3 :(得分:1)
第1点: -
在C中,字符串始终以'\0'
(NULL终止)结束,您应该始终在末尾手动插入'\0'
,我想您已忘记了。但是当我开始时,即使我也不记得它也不用担心...... :),这样的经历会让你从下次开始。
第2点: -
假设你有一个字符串char str[]="ABCD" ;
,在内存中这将是这样的
------------IN Memory----------------
| 'A' || 'B' || 'C' | | 'D' | | '\0' |
-------------------------------------
0 1 2 3 4
只是看看我们可以说它的长度是4 (我们知道在计算长度时我们不包括'\0'
)。对于反向复制,我们需要从索引为3 的字符'D'
开始,这意味着您必须从第二个最后一个字符开始复制,其索引可以从长度找到字符串-1 。你在上面的程序中所犯的错误是你使用字符串的长度(即4)来开始复制。它将'\0'
复制为rev[]
中的第一个字符,因此它没有提供输出。
其他要点: -
根据以上两点,我已经纠正了错误,请参阅以下程序中的评论以便更好地理解它。我使用int j;
代替int l;
,因为我感到很困惑。
并且在使用scanf();
阅读字符串时请使用宽度说明符在您的while循环中,您应该将条件从i>0
更改为i>=0
因为当i
达到0时,i>0
条件会在将第一个字符从word[]
复制到rev[]
之前中断循环。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char word[40];
char *rev;
int i=0;
int j=0;
printf("Enter any statement \n");
scanf("%39[^\n]", word);//using width specifier,(POINT 1)here 39 because sizeof(word)-1, one left to accommodate '\0' at end.
while(word[i]!='\0')//calculating length of string
{
i++;
}
rev=(char *)malloc(i*sizeof(char)+1);// (POINT 1),here making +1 to accommodate '\0' at end.
i=i-1;//(POINT 2)- Last index of the array is always length of string - 1
while(i>=0)//This should be i>=0 because you also want to copy first character of input string.
{
rev[j]=word[i];
i--;
j++;
}
rev[j]='\0';//(POINT 1) You should end with '\0'.
printf("\n %s", rev);
return 0;
}
答案 4 :(得分:0)
您的scanf格式字符串看起来很奇怪。也许你正在使用它我不知道的一些奇怪的功能,所以我会传递它。但是,在用户输入完成后,您需要确保word
是一个以空字符结尾的字符串。
while(word[i]!='\0')
此循环计算直到找到空术语。所以i
将包含字符串长度:你刚刚发明了strlen()函数。它不包含字符串长度加上空终止符长度(1)。
因此
rev=(char *)malloc(i*sizeof(char));
不正确,需要分配i + 1个字节。
另外,你不应该转换malloc的结果,因为这样做是完全没有意义的。
复制时,必须确保复制空终止符。
答案 5 :(得分:0)
代码有几个内存错误,使用静态内存也是一个问题。但是,如果你在练习中使用以下是变化及其解释。
i--; // you can't place a '\0' to your rev[0] else it would always be NULL string when you print
while(i>=0)
{
rev[l]=word[i];
i--;
l++;
}
rev[l]='\0'; // string should be terminated by '\0'
printf("\n%s\n", rev);
答案 6 :(得分:0)
只需一次修改的代码下面应该返回正确的答案。我从第二个循环中改变了:
转[1] =字[I];
到
转[1] =字[I-1];
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char word[40];
char *rev;
int i=0;
int l=0;
printf("Enter any statement \n");
scanf("%[^\n]", word);
while(word[i]!='\0')
{
i++;
}
// i contains the length of the string
rev=(char *)malloc(i*sizeof(char));
while(i>0)
{
rev[l]=word[i-1];
i--;
l++;
}
printf("\n %s", rev);
return 0;
}
答案 7 :(得分:0)
//Reverse of a string without using string functions
#include<stdio.h>
#include<conio.h>
void main()
{
char a[40];
int j=0,len=0;
clrscr();
printf("please enter your name\n");
gets(a); // takes white spaces as characters
printf("the reverse of your name is\n");
while (a[j]!=NULL) // finding the length of the string array
{
len++;
j++;
}
for(int k=len;k>=0;k--)
{
printf("%c",a[k]);
}
getch();
}
输出 - 请输入您的姓名
dwayne rock johnson
the reverse of your name is
nosnhoj kcor enyawd
答案 8 :(得分:-3)
如上所述,数组索引从零开始,以长度-1结束。此外,如果您愿意,可以用更加神秘的方式重写代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char word[40];
char *rev;
int i=0;
int l=0;
printf("Enter any statement \n");
scanf("%[^\n]", word);
while(word[++i]);
// i contains the length of the string
rev=(char *)malloc(i*sizeof(char));
while(rev[l++]=word[i---1], i>0);
printf("%s\n", rev);
return 0;
}