■標準ヘッダを使った例(推奨)
#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>
void 大文字小文字変換(char *line){
for(char *cp = line;*cp != '\0';cp++){
if(!isalpha(*cp)) {
continue ;
}
if(isupper(*cp)) {
*cp = tolower(*cp);
continue ;
}
if(islower(*cp)) {
*cp = toupper(*cp);
continue ;
}
}
}
int main(void){
char buf[BUFSIZ];
const char *filename = "/usr/include/stdio.h";
FILE *fp = fopen(filename,"r");
if(fp == NULL){
fprintf(stderr,"開かん %s\n",filename);
exit(1);
}
while(fgets(buf,BUFSIZ,fp) != NULL){
printf("↑:%s",buf);
大文字小文字変換(buf);
printf("↓:%s",buf);
}
}
ctype.hで定義されている標準関数を使うと
コードが読みやすくなります。
変換対象が/usr/include/stdio.hのように
アスキーコードだけで記述されている場合
このコードで動きます。
変換対象が全角を含むUTF-8で書かれている場合、
このコードは不完全で
if(!isalpha(*cp)) {ではなくて、
if(!isalpha((unsigned char)*cp)) {とする必要があります。
変換対象が全角を含むShift_JISで書かれている場合、
Shift_JISの2バイト目がアスキーコードと重なるので、
単純にctype.hの is 系関数を使うのは無理があるようです。
(すみません、筆者は文字コードに詳しくないです)
参考:
■文字定数を使った例
void 大文字小文字変換(char *line){
for(char *cp = line;*cp != '\0';cp++){
if(('a' <= *cp && *cp <= 'z') ||
('A' <= *cp && *cp <= 'Z')) {
if(('A' <= *cp) && (*cp <= 'Z')) {
*cp = *cp - 'A'+'a';
continue ;
}
if(('a' <= *cp) && (*cp <= 'z')) {
*cp = *cp - 'a' + 'A';
continue ;
}
}
}
}
■16進数字を使った例(非推奨)
void 大文字小文字変換(char *line){
for(char *cp = line;*cp != '\0';cp++){
if((0x61 <= *cp && *cp <= 0x7a) ||
(0x41 <= *cp && *cp <= 0x5A)) {
if((0x41 <= *cp) && (*cp <= 0x5A)) {
*cp = *cp - 0x41+0x61;
} else {
if((0x61 <= *cp) && (*cp <= 0x7a)) {
*cp = *cp - 0x61 + 0x41;
}
}
}
}
}
16進定数の意味をアスキーコード表で調べる必要があります。