
問題は、
ファイルにあるアルファベットの大文字を小文字に変換し、小文字は大文字に変換して、ファイルに保存するプログラムを作りなさい
というものです。
色々考えて、
#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のような関数を使ったのは初めてなのでよく使い方が分からずこのようなプログラムになってしまいました。
どうか正しく動くようなプログラムを教えてください。お願いします。
No.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
No.1
- 回答日時:
>のようなプログラムを考えましたが、うまくいきません。
どううまくいきませんか?
環境など書かれていないようですが、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文内に入れてコンパイルしたところエラーは表示されませんでしたが、
実行しても変換はされませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
宣言による処理の重さ
-
getchar()を int でとる理由...
-
c言語
-
ConvertINetStringについて
-
MFCでのBITMAP作成について
-
for文 アスタリスクで形を作る
-
char* を渡したとき、不適切なP...
-
ワイルドカードを用いた文字列検索
-
YUV⇔RGB変換がうまくいきません。
-
C言語エラーについて
-
アドレスの中身を参照する方法
-
あるシーケンスに含まれるある...
-
配列から指定するデータを取り...
-
メモリの再確保について
-
C言語について
-
LCD表示の制御
-
strcmp と strcpy の使い方で疑問
-
コマンドラインに入力されてい...
-
phpMyAdminからストアドプロシ...
-
sprintfに同じ変数は使えるか
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
charからLPTSTRへの変換方法
-
テキストデータをそのままバイ...
-
c++ 文字列を入力して、一文字...
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
WORDをcharに変換する方法
-
strncpyと_tcsncpy_sのヌルの扱...
-
型変換
-
配列をnビットシフトする
-
atoi( ) の反対をやりたい
-
Win32APIでのエディットボック...
-
間接参照のレベルが異なっています
-
c言語配列の結合についてです。...
-
【C言語】テキストファイル内の...
-
double型の値をchar配列に変換...
-
switch文で文字を比較すること...
-
C言語のfor文です。 繰り返しの...
おすすめ情報