【问题标题】:Converting char array to upper case in C [closed]在C中将char数组转换为大写[关闭]
【发布时间】:2019-03-20 14:23:13
【问题描述】:

我正在尝试在 C 中将 char 数组转换为大写。但它仍然以小写形式打印出来。转换函数的逻辑对我来说看起来不错。我不知道问题是否可能是我传递给此函数的输入是结构变量的成员。

这是我将其成员传递给转换函数的结构:

typedef struct AESParams {
   unsigned char output[192];
} AESParams;

我的转换函数如下所示:

void stringUpr(char *s)
{
    int i=0;
    while(s[i]!='\0')
    {
        if(s[i]>='a' && s[i]<='z'){
            s[i]=s[i]-32;
        }
        ++i;
    }
}

我调用转换函数如下:

AESParams parameters;
stringUpr(parameters.output);

如果我在调用“stringUpr”函数后打印输出,该值仍然是小写。谁能告诉我这里的问题可能是什么原因?

TIA...

更新:将值写入输出的代码。

EVP_EncryptUpdate(&ctx, parameters->output, &outLen, input, length); 
// This call happens in some other file. parameters is passed to the function that calls this function and after computation parameters is passed back to the place where I'm calling stringUpr().

我相信这条线可以正常工作,并且在计算后会给出正确的结果。只是我想把这个值转换成大写写入文件。

【问题讨论】:

  • 为什么不能使用 toupper?
  • 设置和打印parameters的邮政编码。
  • parameters 是 typedef 和变量?你编码works
  • 由于您有两个不同的变量称为parameters(一个是结构,另一个是指针),您确定将正确的东西传递给strUpper

标签: c uppercase


【解决方案1】:

您的程序假定它使用 ASCII 字符集运行,但不能保证这一点。使用ctype.h中定义的标准函数

void stringUpr(char* s)
{
    int i = 0;
    while(s[i] != '\0')
    {
        s[i++] = toupper((unsigned char)s[i]);
    }
}

【讨论】:

  • if (islower(s[i]) 是多余的,因为如果toupper(c) 在当前语言环境中存在,则返回c 的大写表示,否则返回c
  • 另外,如果char数组不是ASCII,也不能是某些字符减去32后数组的内容是一样的。唯一的方法是,如果某些字母不在“a”和“z”之间
  • @Ahrtaler toupper() 不是纯 ASCII 函数。无论使用的执行字符集如何,它都会将小写字母转换为适当的大写字母。
  • @Ahrtaler 那么为什么要发表关于“从某些字符中减去 32”的评论。这是从小写到大写的仅 ASCII 大小写转换。
  • @PCLuddite en.cppreference.com/w/cpp/string/byte/toupper - "与&lt;cctype&gt; 中的所有其他函数一样,如果参数的值既不能表示为unsigned char 也不等于@,则std::toupper 的行为是未定义的987654332@。为了安全地使用这些函数和普通的chars(或signed chars),首先应该将参数转换为unsigned char"
猜你喜欢
  • 1970-01-01
  • 2016-05-12
  • 2015-09-02
  • 1970-01-01
  • 2013-06-12
  • 2016-12-31
  • 2011-06-08
  • 2013-05-02
  • 1970-01-01
相关资源
最近更新 更多