我开始编写此代码以反转字符串。但是在输出中,它仅要求输入,然后退出。如果有人告诉我这个问题的最简单解决方案,那将有很大的帮助。
char* ptr;
//main function
{
int i;
char *OriginalString1,*OriginalString2;
OriginalString1=(char*)malloc(100*sizeof(char));
//Input string
printf("Enter the string: ");
scanf("%s", OriginalString1);
strcpy(OriginalString2, OriginalString1);
free(OriginalString1);
char reversestring[sizeof(OriginalString2)];
char revstr[sizeof(OriginalString2)];
Reverse_String(OriginalString2, reversestring);
for(i=0;ptr!=reversestring-1; i++)
{
revstr[i]=*(ptr-1);
ptr--;
}
revstr[i+1]='\0';
printf("\nThe reverse string is: %s \n", revstr);
}
//Function to reverse the string
char *Reverse_String(char *OriginalString,char reversestring[])
{
int i;
ptr=reversestring;
for(i=0; *(OriginalString+i) != '\0'; i++)
{
*ptr = *(OriginalString+i);
ptr++;
}
*ptr='\0';
return (char*)ptr;
}
我希望输入“ hi”的输出为“ ih”。但是我只能给出输入,而没有输出。
答案 0 :(得分:3)
此声明
strcpy(OriginalString2, OriginalString1);
没有意义,因为指针OriginalString2
的值不确定。尚未初始化。
这些声明
char reversestring[sizeof(OriginalString2)];
char revstr[sizeof(OriginalString2)];
没有意义,因为使用的是指针的大小,而不是指针所指向的字符串的大小。
如果您的编译器支持可变长度数组,则可以编写
char reversestring[strlen(OriginalString2) + 1];
函数Reverse_String
使用全局变量ptr
也是一个坏主意。您可以在函数中定义它。
这个循环
for(i=0; *(OriginalString+i) != '\0'; i++)
{
*ptr = *(OriginalString+i);
ptr++;
}
不会以相反的顺序复制原始字符串。
该函数可以按照演示程序中所示的方式进行查找。
#include <stdio.h>
#include <string.h>
char * reverse_copy( const char *s1, char *s2 )
{
size_t n = strlen( s1 );
size_t i = 0;
for ( ; i < n; i++)
{
s2[i] = s1[n - i - 1];
}
s2[i] = '\0';
return s2;
}
int main(void)
{
const char s1[] = "Hello Vijay";
char s2[sizeof( s1 )];
reverse_copy( s1, s2 );
puts( s1 );
puts( s2 );
return 0;
}
porgram输出为
Hello Vijay
yajiV olleH
如果您不想(或不允许)使用标准C函数strlen
并希望使用指针,则该函数可以采用以下方式
#include <stdio.h>
char * reverse_copy( const char *s1, char *s2 )
{
const char *in = s1;
while ( *in != '\0' ) ++in;
char *out = s2;
while ( in != s1 )
{
*out++ = *--in;
}
*out = '\0';
return s2;
}
int main(void)
{
const char s1[] = "Hello Vijay";
char s2[sizeof( s1 )];
reverse_copy( s1, s2 );
puts( s1 );
puts( s2 );
return 0;
}
程序输出与上面相同
Hello Vijay
yajiV olleH
答案 1 :(得分:-1)
您使用的malloc&free错误,您在保存原始字符串的缓冲区上调用了free。您必须先完成使用它才能释放originalString1。
下面,我提供了一种反转字符串的标准方法,但是通常可以在原位进行反转。
// Macros to make reading strings from command line into buffer more safe
#define SCANF_CFORMAT(S) "%" #S "c"
#define CSIZE(S) SCANF_CFORMAT(S)
// Size of input string, excluding NUL terminator
#define BUFSIZE 100
//Function to reverse the string
char *Reverse_String(char *originalString, char *reverseString)
{
uint32_t i, n=0;
// Sanity check input and output buffers
if (!originalString || ! reverseString){
return NULL;
}
// Find length of original string -- could have used strlen()
while (originalString[n] != '\0' && n < BUFSIZE){
n++;
}
reverseString[n+1] = '\0'; // NUL terminate reversed string.
for(i=0; i < n; i++){
reverseString[n-i-1] = originalString[i];
}
}
void main(void)
{
int i;
char originalString[BUFSIZE+1];
char reverseString[BUFSIZE+1];
// Input string
printf("Enter the string: ");
scanf(CSIZE(BUFSIZE), originalString);
Reverse_String(originalString, reverseString);
printf("\nThe reverse string is: %s \n", reverseString);
}