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]) != '\0'; 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] != '\0')
      {

        /*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);
4

2 に答える 2

3

「あ」は文字列です。

「あ」は文字です。

したがって、 tolower()に文字列をフィードしているので、これを変更します。

fputs(tolower(clef[c-idx]), fp);

これに:

fputc(tolower(clef[c-idx][0]), fp);

ディミトリが言ったように、文字列には適してfputc()いないを使用したい..fputs()

Keith Thompson が述べたように:tolower()引数が負で EOF と等しくない場合、未定義の動作をします。引数を変換するには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
于 2016-09-13T17:57:30.527 に答える
0

配列内のすべての要素を取得し、それを補助文字に入れて使用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;
} 
于 2016-09-13T18:03:39.373 に答える