繁体   English   中英

'toupper'和'tolower'对C语言中的char数组没有影响

[英]'toupper' and 'tolower' have no effect on char array in C

我正在创建一个创建用户名的函数。 要求用户输入名字,然后输入姓氏。 姓氏与名字的首字母串联。 另外,任何大写字母都应转换为小写字母。 因此,输入“ John DoE”应等于“ jdoe”。

另一个函数计算字符串“此语句具有较小的大小写字符”中小写字母的数量。 然后将小写字母转换为大写字母并打印字符串。

第一个函数不会将大写字母转换为小写字母。 第二个功能甚至无法识别任何字符的ASCII值。

我已经尝试过将指针用于两个函数,但是输出没有变化。

void createUsername()
{
int j = 1;
char firstName[15], lastName[15], userName[20];

printf("Enter your first name : ");
fgets(firstName, 15, stdin);
firstName[strlen(firstName) - 1] = '\0';

printf("Enter your last name : ");
fgets(lastName, 15, stdin);
lastName[strlen(lastName) - 1] = '\0';

userName[0] = tolower(firstName[0]);

for (int i = 0, j; lastName[i] != '\0'; i++, j++)
    userName[j] = tolower(lastName[i]);
userName[j+1] = '\0';

printf("User name : %s", userName);
}

void lowerToUpperCase()
{
char sentence[] = "THiS SentENCE HAS SOMe LoWEr CASE ChARAcTERs";
int lowerCases = 0;
for (int i = 0; sentence[i] != '\0'; i++)
{
    if ((sentence[i] >= 97) && (sentence[i] <= 122))
    {
        lowerCases++;
        sentence[i] = toupper(sentence[i]);
    }
}
printf("Number of lower case characters= %d \n", lowerCases);
printf("Upper case sentence : %s \n", sentence);
}

Joe SMITH的预期输出应为jsmith。 小写字母的数量应为10,并且句子应打印所有大写字母。

实际输出为JSMITH,小写字母的数量为0,该句子打印出原始字母。

除了其他答案中提到的问题之外,您还存在内存覆盖问题。 输入比缓冲区更长的名称会导致生产上的极大痛苦。 更好地动态分配足够的内存以容纳名称。

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

void createUsername() {
    printf("Enter your first name : ");
    char *firstName;
    errno = 0;
    int n = scanf("%ms", &firstName);
    if (n != 1) {
        perror("scanf");
        exit(EXIT_FAILURE);
    }

    printf("Enter your last name : ");
    char *lastName;
    errno = 0;
    n = scanf("%ms", &lastName);
    if (n != 1) {
        perror("scanf");
        free(firstName);
        exit(EXIT_FAILURE);
    }

    char *userName = (char *) malloc(1u + strlen(lastName) + 1u);
    userName[0] = tolower(firstName[0]);
    char *userNameIter = userName + 1;
    char *lastNameIter = lastName;
    while ((*userNameIter = tolower((unsigned char) *lastNameIter))) {
        userNameIter++;
        lastNameIter++;
    }

    printf("User name : %s\n", userName);
    free(userName);
    free(lastName);
    free(firstName);
}

void lowerToUpperCase() {
    char sentence[] = "THiS SentENCE HAS SOMe LoWEr CASE ChARAcTERs";
    int lowerCases = 0;
    for (int i = 0;; i++) {
        unsigned char const ch = (unsigned char) sentence[i];
        if (islower(ch)) {
            lowerCases++;
            sentence[i] = toupper(ch);
        } else if (ch == '\0') {
            break;
        }
    }
    printf("Number of lower case characters = %d\n", lowerCases);
    printf("Upper case sentence : %s\n", sentence);
}

让我们从简单的事情开始,我们将从那里开始:

您可以轻松地将asentence[i]进行比较。 做这个:

if ((sentence[i] >= 'a') && (sentence[i] <= 'z'))
{
    lowerCases++;
    sentence[i] = toupper(sentence[i]);
}

比这有点:

i < lastName[i] != '\0'

这到底是什么鬼? 如果您查看此页面: https : //en.cppreference.com/w/c/language/operator_precedence,您将看到<优先于!=

编辑:

for (int i = 0, j; lastName[i] != '\0'; i++, j++)

j在这里重新初始化为for()循环的局部变量,因此它可能会变为0,但在我的情况下,它总是会出现一些垃圾和setfault。 所以把这个:

for (int i = 0; lastName[i] != '\0'; i++, j++)

然后您就可以开始了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM