当前位置: 首页 > 知识库问答 >
问题:

c中两个独立字符串的大写字母的连接

柳绪
2023-03-14

我正在为即将到来的考试做练习题,但似乎无法找出一个问题,目标是:

编写一个C程序来读取两个字符串s1s2。每个字符串的最大大小为25。形成两个名为上部下部的新字符串。Lower由连接的s1s2的小写字母组成,而upper包含两个字符串的大写字母的连接。

例如:输入:

s1:绿蓝色
s2:客车

输出:

上:绿卡
下:蓝巴

我已经尝试了几天,但还没能完全弄清楚。

到目前为止,我有以下信息:

#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);
}

共有3个答案

厍彭薄
2023-03-14

您仍然有一个问题:如果输入的字符串长度超过23个字符,会发生什么情况?你的程序将崩溃。

如果最大大小为25个字符,数组的尺寸必须为26,而不是25,以解释终止的NULL。

然后为了安全起见,您必须设置s1[N-1]='\0'和s2[N-1]='\n'。如果您输入的第一个字符串太长,第二个字符串将最终成为剩余字符,忽略您在第二个字符串提示后输入的任何内容。

容磊
2023-03-14

以下是我到目前为止的情况:)

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define N   25

int main(void)
{
    char s1[N];
    char s2[N];
    char *upper, *lower;
    char *p, *q;
    size_t n1, n2;

    printf( "Please enter first string: " );
    fgets( s1, N, stdin );

    printf( "Please enter second string: " );
    fgets( s2, N, stdin );

    n1 = 0; n2 = 0;

    for ( p = s1; *p; ++p )
    {
        if ( isupper( ( unsigned char )*p ) ) ++n1;
        else if ( islower( ( unsigned char )*p ) ) ++n2;
    }

    for ( p = s2; *p; ++p )
    {
        if ( isupper( ( unsigned char )*p ) ) ++n1;
        else if ( islower( ( unsigned char )*p ) ) ++n2;
    }

    upper = NULL; lower = NULL;

    if ( n1 && ( upper = ( char * )malloc( n1 + 1 ) ) )
    {
        q = upper;

        for ( p = s1; *p; ++p )
        {
            if ( isupper( ( unsigned char )*p ) ) *q++ = *p;
        }

        for ( p = s2; *p; ++p )
        {
            if ( isupper( ( unsigned char )*p ) ) *q++ = *p;
        }

        *q = '\0';
    }       

    if ( n2 && ( lower = ( char * )malloc( n1 + 1 ) ) )
    {
        q = lower;

        for ( p = s1; *p; ++p )
        {
            if ( islower( ( unsigned char )*p ) ) *q++ = *p;
        }

        for ( p = s2; *p; ++p )
        {
            if ( islower( ( unsigned char )*p ) ) *q++ = *p;
        }

        *q = '\0';
    }       

    if ( upper ) printf( "Upper: %s\n", upper );
    if ( lower ) printf( "Lower: %s\n", lower );

    free( upper );
    free( lower );

    return 0;
}

程序输出可能如下所示

Please enter first string: GREENblue
Please enter second string: busCAR
Upper: GREENCAR
Lower: bluebus

若您的编译器支持可变长度数组,那个么您可以使用VLA而不是动态分配的数组。

这是一个使用VLA的程序

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define N   25

int main(void)
{
    char s1[N];
    char s2[N];

    printf( "Please enter first string: " );
    fgets( s1, N, stdin );

    printf( "Please enter second string: " );
    fgets( s2, N, stdin );

    size_t n1 = 0, n2 = 0;

    for ( const char *p = s1; *p; ++p )
    {
        if ( isupper( ( unsigned char )*p ) ) ++n1;
        else if ( islower( ( unsigned char )*p ) ) ++n2;
    }

    for ( const char *p = s2; *p; ++p )
    {
        if ( isupper( ( unsigned char )*p ) ) ++n1;
        else if ( islower( ( unsigned char )*p ) ) ++n2;
    }


    char upper[n1 + 1];
    char lower[n2 + 1];

    if ( n1 )
    {
        char *q = upper;

        for ( const char *p = s1; *p; ++p )
        {
            if ( isupper( ( unsigned char )*p ) ) *q++ = *p;
        }

        for ( const char *p = s2; *p; ++p )
        {
            if ( isupper( ( unsigned char )*p ) ) *q++ = *p;
        }

        *q = '\0';
    }       

    if ( n2 )
    {
        char *q = lower;

        for ( const char *p = s1; *p; ++p )
        {
            if ( islower( ( unsigned char )*p ) ) *q++ = *p;
        }

        for ( const char *p = s2; *p; ++p )
        {
            if ( islower( ( unsigned char )*p ) ) *q++ = *p;
        }

        *q = '\0';
    }       

    if ( n1 ) printf( "Upper: %s\n", upper );
    if ( n2 ) printf( "Lower: %s\n", lower );


    return 0;
}
孟茂
2023-03-14

在您的代码中,在strcat()的用法中

 strcat (s1, s2);

s1可能没有足够的内存来保存连接的字符串。在这种情况下,它调用未定义的行为。

从手册页,

如果dp不够大,程序行为是不可预测的;缓冲区溢出是攻击安全程序的最受欢迎的途径。

根据你的要求

每个字符串的最大大小为25

您需要一个长度为25 X 2的目标缓冲区(对于chars)1(对于null)。

此外,它还表示,您需要s1s2具有26个元素,每个元素用于容纳空值。

根据您的要求,您的程序需要进行某些设计更改,如下所示:

>

上限下限的大小必须为输入大小的总和。如果s1s2都是完全大写(或小写)的话,请考虑这种情况。因此,您需要上[51]下[51]

 类似资料:
  • 编写一个程序,当给定一个代表地毯的字符串时,输出其价格。示例:abacx答案:20(长度5乘以4种不同类型) 以下是我到目前为止的情况。以下是测试案例3a)qiraat 3b)cdefghijklmnopqrstuwxyz 3c)warrior 3d)SupercalibragilisticExpialidious

  • 问题内容: 如何使用MySQL查询来计算大写字母?我现在正在尝试 但这给我一个错误的说法: 我猜,我不允许在AGAINST子句中使用列表,这很烂 那么,有没有办法实现这一目标? 问题答案: 试试这个功能- 例子:

  • 问题内容: 我想在angularjs中大写字符串的第一个字符 当我用它转换整个字符串为大写。 问题答案: 使用此大写过滤器

  • 假设和。现在比较和,找出常见的字母。然后用普通大写字母打印str1。怎么做? 输出:

  • 将一个字符串的第一个字母(大写字母)变成小写。 使用数组解构和 String.toLowerCase() 将第一个字母变成小写,...rest 是获取第一个字母之后字符数组,然后使用 Array.join('') 使其再次拼接成为字符串。 省略 upperRest 参数来保持字符串的其余部分不变,或者将其设置为 true 来将字符串的其余部分转换为大写。 const decapitalize =

  • 本文向大家介绍C#找出字符串中第一个字母并大写的方法,包括了C#找出字符串中第一个字母并大写的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#找出字符串中第一个字母并大写的方法。分享给大家供大家参考,具体如下: 更多关于C#相关内容感兴趣的读者可查看本站专题:《C#数据结构与算法教程》及《C#字符串操作技巧总结》 希望本文所述对大家C#程序设计有所帮助。