我正在为即将举行的考试准备练习题,但似乎无法找出目标是什么的问题:
编写一个C程序来读取两个字符串s1
和s2
。每个字符串的最大大小为25。形成两个名为upper
和lower
的新字符串。小写由s1
和s2
的小写字母组成,而upper
包含两个字符串的大写字母的组成。
例如:
输入:
s1:GREENblue s2:busCAR
输出:
上:GREENCAR下:bluebus
我已经尝试了几天,但还不能完全弄清楚。
这是我到目前为止的内容:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <conio.h>
int main()
{
int i, j;
char s1[25];
char s2[25];
char upper[25];
char lower[25];
printf ("Please enter first string: ");
scanf ("%s", &s1);
printf ("Please enter second string: ");
scanf ("%s", &s2);
strcat (s1, s2);
for (i=0; i<strlen(s1); i++)
{
if (s1[i]>=65 && s1[i] <= 90)
{
upper[i] = s1[i];
}
else
{
lower[i] = s1[i];
}
}
printf ("Upper: %s\n", upper);
printf ("Lower: %s\n", lower);
}
最佳答案
我认为您已经有了大致的想法,但错过了一些重要的细节:
不要使用strcat
连接两个字符串。您已经将它们每个都放在自己的缓冲区中,如果要执行此操作,最好确保有足够的内存来容纳较大的结果字符串。if (s1[i]>=65 && s1[i] <= 90)
这种情况对于检查大写字母是一个很好的条件,但是它的否定会使您拥有其他所有内容,包括小写字母,数字等。因此最好只包含3个大小写(大写,小写,其他所有内容)安全)。
如果要打印上/下数组的内容,请确保附加'\0'
字符,以便打印函数将它们解释为字符串。
j=0; //iterator for lower
k=0; //iterator for upper
for (i=0; i<strlen(s1); i++)
{
if (s1[i]>='A' && s1[i] <= 'Z') // a bit more clear
{
upper[k++] = s1[i];
}
else
{
if (s1[i]>='a' && s1[i] <= 'z')
{
lower[j++] = s1[i];
}
else
{
//print something or just exit...
}
}
}
for (i=0; i<strlen(s2); i++)
{
if (s2[i]>='A' && s2[i] <= 'Z') // a bit more clear
{
upper[k++] = s2[i];
}
else
{
if (s2[i]>='a' && s2[i] <= 'z')
{
lower[j++] = s2[i];
}
else
{
//print something or just exit...
}
}
}
//add the string terminator character
lower[j] = '\0';
upper[k] = '\0';
//print the result
printf ("Upper: %s\n", upper);
printf ("Lower: %s\n", lower);
这应该做的工作。