如何在C语言中计算字符串的字符数并将它们分配给不同的组(小写和大写)

如何在C语言中计算字符串的字符数并将它们分配给不同的组(小写和大写),c,arrays,string,uppercase,lowercase,C,Arrays,String,Uppercase,Lowercase,我用C编写了一个程序,从用户那里获取一个字符串(限制为50个字符),并将大写字符分配给名为upper的字符串,将小写字符分配给lower,最后它应该打印这些字符串(首先是upper)。我的问题是,当我输入一个字符串时,它只打印一个字符串(即,如果该字符串以大写字符开头,则将打印upper),而不是其中两个 这是我的密码: #include <stdlib.h> #include <stdio.h> #include <string.h> #include &l

我用C编写了一个程序,从用户那里获取一个字符串(限制为50个字符),并将大写字符分配给名为
upper
的字符串,将小写字符分配给
lower
,最后它应该打印这些字符串(首先是
upper
)。我的问题是,当我输入一个字符串时,它只打印一个字符串(即,如果该字符串以大写字符开头,则将打印
upper
),而不是其中两个

这是我的密码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <math.h>

#define MAX_LEN 50

int main()
{
    char str[MAX_LEN] = { 0 };
    char upper[MAX_LEN] = { 0 };
    char lower[MAX_LEN] = { 0 };
    int i = 0;
    int j = 0;

    printf("Enter a string: ");
    fgets(str, MAX_LEN, stdin);
    str[strcspn(str, "\n")] = 0;

    for (i = 0; i < strlen(str); i++)
    {
        if (str[i] > 'A' && str[i] < 'Z')
        {
            upper[j] = str[i];
        }
        else if (str[i] > 'a' && str[i] < 'z')
        {
            lower[j] = str[i];
        }
        j++;
    }

    printf("%s", upper);
    printf("%s", lower);

    getch();
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#定义最大长度50
int main()
{
char str[MAX_LEN]={0};
字符上限[MAX_LEN]={0};
char lower[MAX_LEN]={0};
int i=0;
int j=0;
printf(“输入字符串:”);
fgets(str、MAX_LEN、stdin);
str[strcspn(str,“\n”)]=0;
对于(i=0;i'A'和&str[i]<'Z')
{
上[j]=str[i];
}
else if(str[i]>'a'和&str[i]<'z')
{
下[j]=str[i];
}
j++;
}
printf(“%s”,上部);
printf(“%s”,更低);
getch();
返回0;
}

您正在使用j作为两个数组的迭代器。你不能那样做。如果这样做,则可能在另一个数组的第一个位置有一个“\0”,并且不会写入该数组

所以你应该这样做:

 #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <time.h>
    #include <math.h>

    #define MAX_LEN 50

    int main()
    {
        char str[MAX_LEN] = { 0 };
        char upper[MAX_LEN] = { 0 };
        char lower[MAX_LEN] = { 0 };
        int i = 0;
        int j = 0, h = 0;

        printf("Enter a string: ");
        fgets(str, MAX_LEN, stdin);
        str[strcspn(str, "\n")] = 0;

        for (i = 0; i < strlen(str); i++)
        {
            if (str[i] >= 'A' && str[i] <= 'Z')
            {
                upper[j++] = str[i];
            }
            else if (str[i] > 'a' && str[i] < 'z')
            {
                lower[h++] = str[i];
            }
        }

        printf("%s", upper);
        printf("%s", lower);

        return 0;
    }
#包括
#包括
#包括
#包括
#包括
#定义最大长度50
int main()
{
char str[MAX_LEN]={0};
字符上限[MAX_LEN]={0};
char lower[MAX_LEN]={0};
int i=0;
int j=0,h=0;
printf(“输入字符串:”);
fgets(str、MAX_LEN、stdin);
str[strcspn(str,“\n”)]=0;
对于(i=0;i='A'&&str[i]'A'&&str[i]<'z')
{
下[h++]=str[i];
}
}
printf(“%s”,上部);
printf(“%s”,更低);
返回0;
}
在这里,仅当您添加一个值时,才在数组上进行迭代。
同样正如在评论中所说的,您应该使用一个计数器来表示两个数组。无论填充哪个数组,都要递增计数器。因此,要处理的第一个字母将确定哪个数组的第一个字符不作为C字符串空终止符

那么?因此,当您使用
printf()
时,它将在您使用
%s
时停止打印,只要它遇到空终止符,就像
的所有函数一样。顺便说一句,你忘了包括那个图书馆

一种解决方案是使用两个计数器,每个数组一个,并增加我们刚刚填充的数组的计数器

此外,使用
=
而不是
来考虑“a”。“z”和它们的大写字母也是如此

把它们放在一起,你会得到这样的结果:

#include <string.h>
#include <time.h>
#include <math.h>
#include <stdio.h> // you hadn't include that!

#define MAX_LEN 50

int main()
{
    char str[MAX_LEN] = { 0 };
    char upper[MAX_LEN] = { 0 };
    char lower[MAX_LEN] = { 0 };
    int i = 0;
    int j = 0; // counter for 'upper'
    int k = 0; // counter for 'lower'

    printf("Enter a string: ");
    fgets(str, MAX_LEN, stdin);
    str[strcspn(str, "\n")] = 0;

    for (i = 0; i < strlen(str); i++)
    {
        if (str[i] >= 'A' && str[i] <= 'Z') // use the equal operator as well for reading 'A' and 'Z' as well
        {
            upper[j++] = str[i]; // increment the counter 'j'
        }
        else if (str[i] >= 'a' && str[i] <= 'z') // use the equal operator as well for reading 'a' and 'z' as well
        {
            lower[k++] = str[i]; // increment the counter 'k'
        }
    }

    // print your strings, but use a newline for aesthetics
    printf("%s\n", upper);
    printf("%s\n", lower);

    return 0;
}

上限
下限
使用不同的索引变量,并在
if语句
中,将
运算符更改为
=
,同样地
对下限和上限变量使用相同的索引变量j。对这两个变量都使用不同的变量。另外,
'A'
-->
='A'考虑了当前区域设置。@BLUEPIXY是的,对于if-else,限制也不正确。您也不需要
str[strcspn(str,“\n”)]=0
因为
fgets()
将插入一个空值,并且您的
str[]
声明将用空值完全填充它。
Georgioss-MacBook-Pro:~ gsamaras$ gcc -Wall main.c
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
Enter a string: Samaras
S
amaras
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <math.h>

#define MAX_LEN 50

int main()
{
    char str[MAX_LEN] = { 0 };
    char upper[MAX_LEN] = { 0 };
    char lower[MAX_LEN] = { 0 };
    int i = 0;
    int up = 0, low = 0;

    printf("Enter a string: ");
    fgets(str, MAX_LEN, stdin);
    str[strcspn(str, "\n")] = 0;

    for (i = 0; i < strlen(str); i++)
    {
        if (str[i] >= 'A' && str[i] <= 'Z')
        {
            upper[up] = str[i];
            up++;
        }
        else if (str[i] >= 'a' && str[i] <= 'z')
        {
            lower[low] = str[i];
            low++;
        }
    }

    printf("%s\n", upper);

    printf("%s", lower);

    getch();
    return 0;
}