我正在为即将举行的考试准备练习题,但似乎无法找出目标是什么的问题:

编写一个C程序来读取两个字符串s1s2。每个字符串的最大大小为25。形成两个名为upperlower的新字符串。小写由s1s2的小写字母组成,而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);



这应该做的工作。

10-04 21:57
查看更多