dポイントプレゼントキャンペーン実施中!

問題は、
ファイルにあるアルファベットの大文字を小文字に変換し、小文字は大文字に変換して、ファイルに保存するプログラムを作りなさい
というものです。
色々考えて、
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>

int main(int argc,char **argv){
int fd,flag1,flag2;
int i,n;
char buffer[512],x;
fd = open(argv[1],O_RDWR);

if(fd == -1)
perror("open");

while((n = read(fd,buffer,sizeof(buffer)))>0){
x = buffer[i];
flag1 = islower(x);
flag2 = isupper(x);

for(i=0;i<n;++i)
if(flag1 == 1){
buffer[i] = toupper(buffer[i]);
}else if(flag2 == 1){
buffer[i] = tolower(buffer[i]);
}
write(fd,buffer,n);
}
close(fd);
exit(0);
}

のようなプログラムを考えましたが、うまくいきません。
toupperのような関数を使ったのは初めてなのでよく使い方が分からずこのようなプログラムになってしまいました。
どうか正しく動くようなプログラムを教えてください。お願いします。

A 回答 (2件)

flag1 = islower(x);


flag2 = isupper(x);

if(flag1 == 1){
buffer[i] = toupper(buffer[i]);
}else if(flag2 == 1){
buffer[i] = tolower(buffer[i]);
}

flagって名前のフラグ変数もどうにかして欲しいけどそれはおいといて、
isupper/islower なんかの戻り値は0/1とは限りません。


Manpage of ISALPHA
http://www.linux.or.jp/JM/html/LDP_man-pages/man …
文字 c が調べた文字の種類に合っていれば 0 以外を返す。そうでなければ 0 を返す。

$cat mogera.c
#include <ctype.h>
#include <stdio.h>
int
main()
{
printf("isupper('A')==%d\n", isupper('A'));
printf("islower('A')==%d\n", islower('A'));
printf("isupper('z')==%d\n", isupper('z'));
printf("islower('z')==%d\n", islower('z'));

return 0;
}

isupper('A')==1
islower('A')==0
isupper('z')==0
islower('z')==2
    • good
    • 0
この回答へのお礼

条件を != 0 としたところうまく動きました!
ありがとうございます!

お礼日時:2008/01/14 03:20

>のようなプログラムを考えましたが、うまくいきません。



どううまくいきませんか?
環境など書かれていないようですが、OSやコンパイラ名なども明記した方がよいでしょう。
# sys/types.hとあるのでLinuxかその辺りかと思われますが。

>while((n = read(fd,buffer,sizeof(buffer)))>0){
>x = buffer[i];
この時、iの値はいったいいくつなのでしょうか?
int型が32Bitの環境を仮定すると、4294966782/4294967294の確率でbuffer[]以外のところを参照しますが。

この回答への補足

>while((n = read(fd,buffer,sizeof(buffer)))>0){
>x = buffer[i];
ここの部分は普通に間違えてました・・・。申し訳ないです。
環境は、Cygwin上でgccを用いてコンパイルしています。

x = buffer[i];
flag1 = islower(x);
flag2 = isupper(x);

この三行をfor文内に入れてコンパイルしたところエラーは表示されませんでしたが、
実行しても変換はされませんでした。

補足日時:2008/01/14 02:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!