将小写字母转换为大写字母
Converting lowercase letters to uppercase
我有一个程序可以反转字符串并将其转换为大写。如果我写 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] = '[=10=]';
//upper(reversed_string);
return reversed_string;
}
void upper(char *str1)
{
while(*str1!='[=10=]')
{
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;
}
问题就在这里
for(int i = 0; i < length/2; ++i)
它 length
是一个奇数(如您的示例中的 11),这将隐式向下舍入,因此您永远不会写入字符串中的中间元素。在你的情况下,这恰好是 0,但不能保证是这样,所以任何字符都可能出现在那里,而不是提前终止字符串。
最简单的解决方法是将其更改为 (length+1)/2
,但这会产生将中间元素写成 两次.
的效果
实际上,我认为如果你只是通过在一个方向而不是从两个方向迭代字符串来反转字符串会容易得多。
我修改了您的代码,它按预期工作。
#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] = '[=10=]';
//upper(reversed_string);
return reversed_string;
}
void upper(char *str1)
{
while(*str1!='[=10=]')
{
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;
}
我有一个程序可以反转字符串并将其转换为大写。如果我写 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] = '[=10=]';
//upper(reversed_string);
return reversed_string;
}
void upper(char *str1)
{
while(*str1!='[=10=]')
{
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;
}
问题就在这里
for(int i = 0; i < length/2; ++i)
它 length
是一个奇数(如您的示例中的 11),这将隐式向下舍入,因此您永远不会写入字符串中的中间元素。在你的情况下,这恰好是 0,但不能保证是这样,所以任何字符都可能出现在那里,而不是提前终止字符串。
最简单的解决方法是将其更改为 (length+1)/2
,但这会产生将中间元素写成 两次.
实际上,我认为如果你只是通过在一个方向而不是从两个方向迭代字符串来反转字符串会容易得多。
我修改了您的代码,它按预期工作。
#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] = '[=10=]';
//upper(reversed_string);
return reversed_string;
}
void upper(char *str1)
{
while(*str1!='[=10=]')
{
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;
}