我有一个程序来反转字符串并将其转换为大写。如果我写helloworld!
,则输出必须为!DLROWOLLEH
。但如果我写hello world!
,则输出为!DLRO
。你能告诉我可能存在的问题吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
char * reverse(const char * text)
{
if (text==NULL)
return NULL;
int length = strlen(text);
char * reversed_string = malloc(length+1);
for(int i = 0; i < length/2; ++i)
{
reversed_string[i] = text[(length-1) - i];
reversed_string[(length-1) - i] = text[i];
}
reversed_string[length] = '\0';
//upper(reversed_string);
return reversed_string;
}
void upper(char *str1)
{
while(*str1!='\0')
{
if(*str1>96&&*str1<123)
*str1=*str1-32;
str1++;
}
}
int main(int argc, char * argv[])
{
char p[256];
fgets(p, sizeof(p), stdin);
char * rev_str = reverse(p);
upper(rev_str);
printf("%s\n", rev_str);
rev_str = 0;
return 0;
}
答案 0 :(得分:3)
问题出在这里
for(int i = 0; i < length/2; ++i)
length
是一个奇数(在你的例子中是11),这将隐式舍入,因此,你永远不会写入字符串中的中间元素。不是你的情况,这恰好是0,但不保证是这样,所以任何字符都可能出现在那里,而不是提前终止字符串。
最简单的修复方法是将其更改为(length+1)/2
,但这会产生中间元素两次的效果。
实际上,我认为如果你只是通过在一个方向而不是从两个方向迭代它来反转字符串就容易得多。
答案 1 :(得分:1)
我修改了您的代码,它按预期工作。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
char * reverse(const char * text)
{
if (text==NULL)
return NULL;
unsigned long length = strlen(text);
char * reversed_string = malloc(length+1);
for(int i = 0; i < length; ++i)
{
reversed_string[i] = text[(length-1) - i];
//reversed_string[(length-1) - i] = text[i];
}
reversed_string[length] = '\0';
//upper(reversed_string);
return reversed_string;
}
void upper(char *str1)
{
while(*str1!='\0')
{
if(*str1>96&&*str1<123)
*str1=*str1-32;
str1++;
}
}
int main(int argc, char * argv[])
{
char p[256];
fgets(p, sizeof(p), stdin);
char * rev_str = reverse(p);
printf("%s\n", rev_str);
upper(rev_str);
printf("%s\n", rev_str);
rev_str = 0;
return 0;
}