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

标签 c arrays string scanf

我正在为即将到来的考试做练习题,但似乎无法弄清楚目标是什么:

编写一个 C 程序来读取两个字符串 s1s2。每个字符串的最大长度为 25。形成两个新字符串,分别称为 upperlower。 Lower 由 s1s2 的小写字母连接而成,而 upper 包含两个字符串的大写字母的连接。

例如: 输入:

s1: GREENblue
s2: busCAR

输出:

upper: GREENCAR
lower: 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()

 strcat (s1, s2);

s1 可能没有足够的内存来保存连接的字符串。在这种情况下,它会调用 undefined behaviour .

从手册页,

If dest is not large enough, program behavior is unpredictable; buffer overruns are a favorite avenue for attacking secure programs.

按照您的要求

The maximum size of each string is 25

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

此外,它还表明,您需要 s1s2 各有 26 元素来容纳 null。

根据您的要求,您的程序需要进行某些设计更改,例如

  1. 您需要 s1s2 各有 26 个元素来容纳 null。

    <
  2. upperlower 两者的大小都必须等于输入大小的总和。想象一下如果 s1s2 都完全大写(或小写)的情况。因此,您需要 upper[51]lower[51]

关于在c中连接两个单独字符串的大写字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30892020/

相关文章:

java - 使用套接字 ID 的套接字详细信息

c++ - 命令行参数的元素数量

C:在接收到信号时停止执行并跳转到程序中的特定点

java基本数组错误

javascript - Vue.js v-model 数据对象

c - 为什么在通过命令行参数传递时,字符串中的十六进制未转换为十六进制?

C中的压缩程序

python - 从 3D numpy 像素数组中删除空的 'rows' 和 'columns'

c++ - 字符串是否在其构造函数中复制数据

php - 在每个单词后最多插入一个前导和尾随换行符