C - 将大写字符转换为小写字符
C - converting a uppercase char to lowercase char
如何将这些字符转换为小写?使用 tolower() 无效。
我有一个这样的数组:
static char clef[][7] =
{
['A'] = "X",
['B'] = "Y",
['C'] = "Z",
['D'] = "A",
['E'] = "B",
['F'] = "C",
['G'] = "D",
['H'] = "E",
['I'] = "F",
['J'] = "G",
['K'] = "H",
['L'] = "I",
['M'] = "J",
['N'] = "K",
['O'] = "L",
['P'] = "M",
['Q'] = "N",
['R'] = "O",
['S'] = "P",
['T'] = "Q",
['U'] = "R",
['V'] = "S",
['W'] = "T",
['X'] = "U",
['Y'] = "V",
['Z'] = "W"
};
此代码旨在根据上述键数组中的移位替换文本中的字母。新文本全部为大写。我想让它们小写,但在“.”之后的情况除外。标记新句子的开始。
static void crack(FILE *fp, const char *buffer, const char *pad1, const char *pad2, int shift_index)
{
int c;
char d;
const char *pad = pad1;
int col = 0;
idx = shift_index - 4;
for (int i = 0; (c = buffer[i]) != '[=11=]'; i++)
{
if (col == 0)
{
fputs(pad, fp);
col += strlen(pad);
pad = pad2;
}
col++;
c = toupper(c);
printf("C :: %d", c);
if (c < MAX_CLEF && clef[c][0] != '[=11=]')
{
/*fputs(clef[c - idx], fp);
printf("Value : %s", clef[c-idx]);*/
if (buffer[i - 1] == '.') {
fputs(clef[c - idx], fp);
}
else {
fputs(tolower(clef[c-idx]), fp);
}
col += strlen(clef[c - idx]);
}
else
{
putc(c, fp);
col++;
printf("C :: right here %d", c);
}
if (col > 72)
{
putc('\n', fp);
col = 0;
}
}
}
但是我在编译时收到了一些警告:
incompatible pointer to integer conversion passing 'char [7]' to parameter
of type 'int' [-Wint-conversion]
fputs(tolower(clef[c-idx]), fp);
和
incompatible integer to pointer conversion passing 'int' to parameter of
type 'const char *' [-Wint-conversion]
fputs(tolower(clef[c-idx]), fp);
"A" 是一个字符串。
'A'是一个字符。
因此您正在向 tolower() 提供一个字符串,因此更改为:
fputs(tolower(clef[c-idx]), fp);
对此:
fputc(tolower(clef[c-idx][0]), fp);
正如 Dimitri 所说,您想使用 fputc()
,而不是 fputs()
,这对字符串很有用..
正如 Keith Thompson 所说:如果参数为负且不等于 EOF,tolower()
具有未定义的行为。要转换 char
参数,您需要将其转换为 unsigned char
.
最小示例:
#include <stdio.h>
#include <ctype.h>
int main (void)
{
char clef[][2] =
{
['A'] = "X",
};
printf("Uppercase = %s\n", clef['A']);
printf("Lowercase = %c\n", tolower((unsigned char)clef['A'][0]));
// or equivalently, as BLUEPIXY stated
printf("Lowercase = %c\n", tolower((unsigned char)(*clef['A'])));
return 0;
}
输出:
C02QT2UBFVH6-lm:~ gsamaras$ gcc -Wall main.c
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
Uppercase = X
Lowercase = x
Lowercase = x
您可以获取数组中的每个元素,将其放入辅助字符中并使用 putchar
然后 tolower
#include <stdio.h>
int main(void) {
int counter=0;
char myChar;
char str[]="ABCDEFG.\n";
while (str[counter])
{
myChar=str[counter];
putchar (tolower((unsigned char)myChar));
counter++;
}
return 0;
}
如何将这些字符转换为小写?使用 tolower() 无效。
我有一个这样的数组:
static char clef[][7] =
{
['A'] = "X",
['B'] = "Y",
['C'] = "Z",
['D'] = "A",
['E'] = "B",
['F'] = "C",
['G'] = "D",
['H'] = "E",
['I'] = "F",
['J'] = "G",
['K'] = "H",
['L'] = "I",
['M'] = "J",
['N'] = "K",
['O'] = "L",
['P'] = "M",
['Q'] = "N",
['R'] = "O",
['S'] = "P",
['T'] = "Q",
['U'] = "R",
['V'] = "S",
['W'] = "T",
['X'] = "U",
['Y'] = "V",
['Z'] = "W"
};
此代码旨在根据上述键数组中的移位替换文本中的字母。新文本全部为大写。我想让它们小写,但在“.”之后的情况除外。标记新句子的开始。
static void crack(FILE *fp, const char *buffer, const char *pad1, const char *pad2, int shift_index)
{
int c;
char d;
const char *pad = pad1;
int col = 0;
idx = shift_index - 4;
for (int i = 0; (c = buffer[i]) != '[=11=]'; i++)
{
if (col == 0)
{
fputs(pad, fp);
col += strlen(pad);
pad = pad2;
}
col++;
c = toupper(c);
printf("C :: %d", c);
if (c < MAX_CLEF && clef[c][0] != '[=11=]')
{
/*fputs(clef[c - idx], fp);
printf("Value : %s", clef[c-idx]);*/
if (buffer[i - 1] == '.') {
fputs(clef[c - idx], fp);
}
else {
fputs(tolower(clef[c-idx]), fp);
}
col += strlen(clef[c - idx]);
}
else
{
putc(c, fp);
col++;
printf("C :: right here %d", c);
}
if (col > 72)
{
putc('\n', fp);
col = 0;
}
}
}
但是我在编译时收到了一些警告:
incompatible pointer to integer conversion passing 'char [7]' to parameter
of type 'int' [-Wint-conversion]
fputs(tolower(clef[c-idx]), fp);
和
incompatible integer to pointer conversion passing 'int' to parameter of
type 'const char *' [-Wint-conversion]
fputs(tolower(clef[c-idx]), fp);
"A" 是一个字符串。
'A'是一个字符。
因此您正在向 tolower() 提供一个字符串,因此更改为:
fputs(tolower(clef[c-idx]), fp);
对此:
fputc(tolower(clef[c-idx][0]), fp);
正如 Dimitri 所说,您想使用 fputc()
,而不是 fputs()
,这对字符串很有用..
正如 Keith Thompson 所说:如果参数为负且不等于 EOF,tolower()
具有未定义的行为。要转换 char
参数,您需要将其转换为 unsigned char
.
最小示例:
#include <stdio.h>
#include <ctype.h>
int main (void)
{
char clef[][2] =
{
['A'] = "X",
};
printf("Uppercase = %s\n", clef['A']);
printf("Lowercase = %c\n", tolower((unsigned char)clef['A'][0]));
// or equivalently, as BLUEPIXY stated
printf("Lowercase = %c\n", tolower((unsigned char)(*clef['A'])));
return 0;
}
输出:
C02QT2UBFVH6-lm:~ gsamaras$ gcc -Wall main.c
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
Uppercase = X
Lowercase = x
Lowercase = x
您可以获取数组中的每个元素,将其放入辅助字符中并使用 putchar
然后 tolower
#include <stdio.h>
int main(void) {
int counter=0;
char myChar;
char str[]="ABCDEFG.\n";
while (str[counter])
{
myChar=str[counter];
putchar (tolower((unsigned char)myChar));
counter++;
}
return 0;
}