我没有得到此代码的输出(反转字符串)。谁能告诉我为什么?
I am not getting the output for this code(Reversing a string). Can anyone tell me why?
我开始编写这段用于反转字符串的代码。但在输出中它只要求输入然后退出。如果有人告诉我这个问题的最简单解决方案,那将很有帮助。
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]='[=10=]';
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) != '[=10=]'; i++)
{
*ptr = *(OriginalString+i);
ptr++;
}
*ptr='[=10=]';
return (char*)ptr;
}
我希望输入 'hi' 的输出为 'ih'。但是我只能提供输入,没有输出。
此声明
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) != '[=13=]'; 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] = '[=14=]';
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
如果您不想(或不允许)使用标准 C 函数 strlen
并且想使用指针,那么该函数可以采用以下方式
#include <stdio.h>
char * reverse_copy( const char *s1, char *s2 )
{
const char *in = s1;
while ( *in != '[=16=]' ) ++in;
char *out = s2;
while ( in != s1 )
{
*out++ = *--in;
}
*out = '[=16=]';
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
您错误地使用了 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] != '[=10=]' && n < BUFSIZE){
n++;
}
reverseString[n+1] = '[=10=]'; // 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);
}
我开始编写这段用于反转字符串的代码。但在输出中它只要求输入然后退出。如果有人告诉我这个问题的最简单解决方案,那将很有帮助。
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]='[=10=]';
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) != '[=10=]'; i++)
{
*ptr = *(OriginalString+i);
ptr++;
}
*ptr='[=10=]';
return (char*)ptr;
}
我希望输入 'hi' 的输出为 'ih'。但是我只能提供输入,没有输出。
此声明
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) != '[=13=]'; 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] = '[=14=]';
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
如果您不想(或不允许)使用标准 C 函数 strlen
并且想使用指针,那么该函数可以采用以下方式
#include <stdio.h>
char * reverse_copy( const char *s1, char *s2 )
{
const char *in = s1;
while ( *in != '[=16=]' ) ++in;
char *out = s2;
while ( in != s1 )
{
*out++ = *--in;
}
*out = '[=16=]';
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
您错误地使用了 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] != '[=10=]' && n < BUFSIZE){
n++;
}
reverseString[n+1] = '[=10=]'; // 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);
}