人に聞けない痔の悩み、これでスッキリ >>

C言語(閏年)の質問です。

任意の範囲の年から閏年の表示とその数をカウントして次の実行結果のように表示するプログラムの作成方法を教えてください。(ここでは2つの年をmain関数内で入力し、その範囲の西暦を引数とする関数checkYearを使用するものとする。int型の関数checkYearは、引数に西暦をとり、その西暦が閏年であれば、1を返し、閏年でない場合は0を返す。)
なお、閏年の判定方法は以下のとおりである。
条件1 西暦年が4で割り切れる年は閏年である
条件2 条件1を満たしていても、西暦年が100で割り切れるときは閏年でない
条件3 条件2を満たしていても、西暦年が400で割り切れるならば閏年である

実行例1
西暦を入力:2000
西暦を入力:2009
2000年
2004年
2008年
閏年は3回あります。

実行例2
西暦を入力:2100
西暦を入力:2000
2000年
2004年
2008年
2012年
2016年
2020年
(省略)
2096年
閏年は25回あります。

実行例3
西暦を入力:2090
西暦を入力:2110
2092年
2096年
2104年
2108年
閏年は4回あります。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

こんな感じでしょうか。


(体裁上、各行先頭のスペースは全角スペースにしてあるので、コピペするとコンパイルできないと思います)

#include <stdio.h>

static int
checkYear (int year)
{
 if ((year % 4) == 0)
 {
  if ((year % 100) == 0)
  {
   if ((year % 400) == 0)
    return (1);
  }
  else
   return (1);
 }

 return (0);
}

int
main (int argc, char * argv[])
{
 int count = 0;
 int year, start, end;

 printf ("西暦を入力:");
 scanf ("%d", &start);
 printf ("西暦を入力:");
 scanf ("%d", &end);

 if (start > end)
 {
  year = end;
  end = start;
  start = year;
 }

 for (year = start; year <= end; year++)
 {
  if (checkYear (year) == 1)
  {
   printf ("%d年\n", year);
   count++;
  }
 }
 if (count != 0)
  printf ("閏年は%d回あります。\n", count);
 else
  printf ("閏年はありません。\n");

 return;
}
    • good
    • 0

閏年の判定条件は、条件3、条件2、条件1 の順番に適用した方がはるかに簡単になります。

    • good
    • 0

えっと。

。。(^^;

> (ここでは2つの年をmain関数内で入力し、その範囲の西暦を引数とする関数checkYearを使用するものとする。int型の関数checkYearは、引数に西暦をとり、その西暦が閏年であれば、1を返し、閏年でない場合は0を返す。)

というプログラムの「閏年であれば」の判定を

> 条件1 西暦年が4で割り切れる年は閏年である
> 条件2 条件1を満たしていても、西暦年が100で割り切れるときは閏年でない
> 条件3 条件2を満たしていても、西暦年が400で割り切れるならば閏年である

で行えばよいだけです。
それがチンプンカンプンという場合は「C言語の文法をほぼ知らない」、「いきなり背伸びし過ぎ」ということで、この問題を行う前に有名なHello worldからやるのがよいです。

ちなみにプログラミング言語云々以前に、やりたい機能仕様とそれを実現するための処理手順を日本語で具体的かつ明確に書けますか? ちまりは設計ですね。
それがしっかり出来るのであれば、処理手順を使用するプログラミング言語に翻訳するだけです。

参考まで。
    • good
    • 2

いつも思うんですけど


質問がざっくりすぎなんですよね

作成方法ってなんですかね
なにが知りたいのでしょうか
あなたのC言語の質問いくつか回答していると思うのですが
まともに返事が返ってきたことが無い気がするのですよ

お礼がほしいとかではなく
解決できたかな?と気になるのですよね

どうせ大学の講義中の課題とかなんでしょうけど
もうちょっと自分で考えてみては?
    • good
    • 5

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QCのプログラムに無性にイライラするのはおかしいですか?

CQ出版のインタフェース 2017-5 の記事のプログラム例に
for( i=0; i<256; i++){
 for( y =0; y < Y; y++ ){
  for( x = 0; x < X; x++){
   p[0] = img -> imageData[img->widthStep* y + x*3 ]; //B(青色)
   if(p[0]==i){hn[i]++;}
  }
 }
}
がありました。このリストを見て、無性にイライラするのは私だけでしょうか?

なぜ、i,y,x の3重のループで処理しないといけないのか、y,xの2重ループで十分ではないかと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++){
  p[0] = img -> imageData[img->widthStep* y + x*3 ];  //B(青色)
  hn[ p[0] ]++;
 }
}

3重にするならせめて、y,x,i の順にしてp[0]への代入は1回で済ませればと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++){
  p[0] = img -> imageData[img->widthStep* y + x*3 ];  //B(青色)
  for( i=0; i<256; i++){
     if(p[0]==i){hn[i]++;}
  }
 }
}

最近のコンパイラの最適化では、私の書いたようなコーディング(修正?)は無意味なのでしょうか?

CQ出版のインタフェース 2017-5 の記事のプログラム例に
for( i=0; i<256; i++){
 for( y =0; y < Y; y++ ){
  for( x = 0; x < X; x++){
   p[0] = img -> imageData[img->widthStep* y + x*3 ]; //B(青色)
   if(p[0]==i){hn[i]++;}
  }
 }
}
がありました。このリストを見て、無性にイライラするのは私だけでしょうか?

なぜ、i,y,x の3重のループで処理しないといけないのか、y,xの2重ループで十分ではないかと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++)...続きを読む

Aベストアンサー

利点を考えてみました


これを並列処理したときに
スレッド0: hn[0] に p[0] = 0 をカウント
スレッド1: hn[1] に p[0] = 1 をカウント
...
とすれば、
・img -> imageData は読み出すだけなので衝突しない
・hn[i] でアクセスする領域は、スレッド毎に i が違うので、同じ箇所に書き込まれることはない。
となり、排他処理が不要となります。
(もちろん、x,y,i,p[0]はスレッドでローカルな変数とします)

ただ、並列処理のオーバーヘッドや同時並列処理数等を考えると、こんな並列処理はしない方が効率的です。


あるいは、hn[]がシークに時間がかかる領域の場合、
hn[p[0]) で毎回違う位置を探しに行って、その時間が無視できないほどだったら、
先にhnを決めてしまった方が速くなるでしょう。

こちらも、非現実的です。

QC言語で数行の「プログラム」を書いてみていただけませんでしょうか

C言語で数行の「プログラム」を書いてみていただけませんでしょうか?御手数をおかけしますが、なにとぞ宜しく御願いします。

買い物、支払い、おつりに関する例です。

×××円の商品を買った。
○○○円をレジで店員に渡した。
(これは、1、5、10、50、100、500、1、000、2,000、5,000、10,000に限らない。客が、「1013円」を払うなどということもあるので。)
コンピューターが減法を行い、おつりの額、□□□円が出力される。
変数の表記は、もちろん何でも構いません。

御多忙中、大変恐縮ですが、プログラムがどう書かれるのか関心がありますので、どうぞ宜しく御願い申し上げます。

自分にもできるのかどうか、という点にも強い関心があります。

たいへんお世話様ですが、どうぞお教え下さい。御願い申し上げます。

Aベストアンサー

たとえば、

#include<stdio.h>
int main(){
 int kakaku,shiharai;
 scanf("%d %d",&kakaku,&shiharai);
 printf("%d\n",shiharai-kakaku);
 return 0;
}

とか。

Qc言語です。puts関数を使って縦に 風 林 火 山 を表示したいんですけど、 風 林火山 になりま

c言語です。puts関数を使って縦に





を表示したいんですけど、

林火山
になります プログラム教えてください( ・ω・)

Aベストアンサー

林と火(と山)の後に \n (改行コード)を付けてないのでは?

QC言語の漢字のホルダーは、chdirでは変更出来ないのだろうか。

下記のソースでは、ホルダーが漢字で無い時は成功するが。
漢字を使うと失敗する。

下記に成功する場合を示す。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(){
char *dir1="C:/Users/usui/mingw";
int ret;

ret=chdir(dir1);
printf("%d\n",ret);
}
上記は、漢字を使っていないので結果は0を表示する。
然し、ホルダーに漢字を使うと-1を表示する。

漢字のホルダーを使う方法をお知えて下さい。
宜しくお願いします。

Aベストアンサー

No3です。
ちなみに私がインストールした(今使っているバージョン)のは、下記URLの
mingw-get-inst-20120426.exe です。
https://sourceforge.net/projects/mingw/files/OldFiles/mingw-get-inst/mingw-get-inst-20120426/

QC言語でのUTF-8の文字列の処理は例えば、比較とかstrtokとかはどうするのか

大量のhtmlファイルを処理をする様になってから今迄はperlを使って来
たが処理が遅いのでC言語を使って早くしようと思って要るが。肝心の
日本語コードの扱いで詰まっている。

例えば、
<!--コメントヘッダーのはじまり-->
.
.
.
<!--コメントヘッダーのおわり-->
と言った場合に、<と>に囲まれた色んなタグが現れて来る。strtokで文
字列を拾って対処をするとしても、文字コードが処理出来なければ何も
進まない。

例えば、上記の場合でhtmlファイルを読んでコメントヘッダーのはじまり
とおわり迄に関しては、出力をしない。他のは全て出力すると言う様な場
合のC言語のソースはどの様に成るのでしょうか。

済みません。未だ、始めたばかりでC言語での記述が出来ません。宜し
く回答願います。

回答はヒントでは無くて直接のC言語のソースを提示願います。宜しく
お願いします。

Aベストアンサー

>回答はヒントでは無くて直接のC言語のソースを提示願います。

これがほしければ、もうちょっと具体的な入出力についての説明が必要です。

ヒントレベルになりますが、状態変数を使って、
状態1:コメント外・・・strstr()などを使って"<!--"を探し、そこまでを出力→状態2へ
状態2:コメント内・・・strstr()などを使って"-->"を探し、その一つ右へポインタを進める→状態1へ
これをHTMLの最後まで繰り返します。

ファイルの中身をすべていったんメモリに持つなら'\0'を見つけるまで繰り返すだけです。限られたバッファでやりくりしようとするなら(ネットワークからダウンロードしながら処理する際にはこのやり方が必須)、バッファ読み込みの際のタグ文字列の泣き別れなどを考慮する必要がありちょっと凝ったテクニックが必要になります。

それとも、UTF-8で書かれたHTMLの"<!--コメントヘッダーのはじまり-->"~"<!--コメントヘッダーのおわり-->"を全削除ですか?だったら、コードをUTF-8で書いて、strstr()で"<!--コメントヘッダーのはじまり-->”を見つけて・・・でいけると思います。文字コードの処理というよりか、見る人が見れば日本語に見えるかもしれない「ただのデータの列」とみなして処理するだけです。

>回答はヒントでは無くて直接のC言語のソースを提示願います。

これがほしければ、もうちょっと具体的な入出力についての説明が必要です。

ヒントレベルになりますが、状態変数を使って、
状態1:コメント外・・・strstr()などを使って"<!--"を探し、そこまでを出力→状態2へ
状態2:コメント内・・・strstr()などを使って"-->"を探し、その一つ右へポインタを進める→状態1へ
これをHTMLの最後まで繰り返します。

ファイルの中身をすべていったんメモリに持つなら'\0'を見つけるまで繰り返すだけです。限られた...続きを読む

Qプログラムの改良

人の作ったプログラムを改良することになりました。
Visual C++ は初めてですが、CやC++は一通り勉強しています。

そこで、いろいろ調べているのですが、
例えば
「MFCは使わずに,Win32API SDKを用いた方法」
などという説明があります。

自分が対応しているプログラムが、そのどちらであるか、あるいはほかの方法で作られているか
というのはどうしたら分かるのでしょうか?

Aベストアンサー

No1です
私はC++は全然触ったこと無いので
あまり的確な回答は期待しないでくださいね

Q1.いいんじゃないでしょうか?
MSDNのOnPoint↓
https://msdn.microsoft.com/ja-jp/library/01c9aaty.aspx

OnPointクラス(Cwndクラス)
https://msdn.microsoft.com/ja-jp/library/1xb05f0h.aspx
このページの一番最初に
「Microsoft Foundation Class ライブラリにあるすべてのウィンドウ クラスの基本機能が用意されています。」と書いてありますから
そういうことですね

Q2.なんでもいいと思いますけど
そもそもあなたが対応するプログラムが
きちんとWin32のみで、もしくはMFCのみで書かれているとは限らないですからね
適当に作られて、両方が混在している可能性だってありますし

Q3.そこからですか
そこは調べればすぐ出てくるかと思いますが
MFCというのはWin32をラッピングしたものです

Q4.作った本人に聞く
仕様書とかがあるならそれを見る

No1です
私はC++は全然触ったこと無いので
あまり的確な回答は期待しないでくださいね

Q1.いいんじゃないでしょうか?
MSDNのOnPoint↓
https://msdn.microsoft.com/ja-jp/library/01c9aaty.aspx

OnPointクラス(Cwndクラス)
https://msdn.microsoft.com/ja-jp/library/1xb05f0h.aspx
このページの一番最初に
「Microsoft Foundation Class ライブラリにあるすべてのウィンドウ クラスの基本機能が用意されています。」と書いてありますから
そういうことですね

Q2.なんでもいいと思いますけど
そもそもあなたが...続きを読む

QC言語で分からない所が有ります。オススメの本は有りますか?他、rubyに鞍替えした方が良いか。

現在、二度目の挫折を経て再びC言語を学習しています。趣味としてやっています。
前回も教えてgoo様で質問させて頂いたのですが(https://oshiete.goo.ne.jp/qa/9256426.html)、今回も質問させて頂きたいと思い書いています。

「新・明解C言語入門編」で勉強しているのですが、どうしてもfor文多重ループが分かりません。
ネットでも検索してみたりはしたのですが、いまいち良く分かりません。
具体的に書くと、P100の演習4-20は答えを見て得心がいき解けるようになりました。演習4-21,演習4-22は解けました。
ですが、演習4-23,演習4-24,演習4-25が全く分かりません。「新・解きながら学ぶC言語」で答えを見てもどうしてそうなるのかが分かりません。
演習4-25のとあるfor文の条件式に、j <= 2 * (h - 1) + 1 と有りますが、条件式にこのような複雑(?)な式を打ち込むという発想が有りません。
答えを丸ごと自分で打ち込んでみましたが、やはり、何かしらの理解の取っ掛かりを得られる事が出来ませんでした。

ちなみに、この部分は前回つまづいた所でも有ります。今までの経験でつまづいた所で覚えているのが、多重ループ、再帰、ビット演算、ポインタです。
(ちなみに前回は同じテキストを利用して分からない所をスルーして先に進んで挫折しました。初回は「苦しんで覚えるC言語」を利用して有る程度先に進んで「ポインタ完全制覇」や「実践C言語」をやっている最中に挫折した覚えが有ります。)
前回、分からない所をスルーして先に進んで挫折した為、今回は分かるようにしてから進んだ方がいいか、と思い質問させて頂いています。

ちなみに、現在所持しているテキストは「新・明解C言語入門編」及び「新・解きながら学ぶC言語」のみです。(他の本は引越しのドタバタで紛失してしまいました、、、。

なので、現在分からない所を分かるようになる為、もしくは勉強の教本を変更する為、新しい本を買おうと思っています。
僕としては、 「やさしいC」と「12歳からはじめるゼロからのC言語ゲームプログラミング教室」がいいかな、と思っています。(Cを学んでその次にC#に進みUnityを使ってゲームを作ろうか、と考えている為です。ゲーム作りに興味が有る為です。

現在勉強している著者も、私が分からないポイント(第4章辺り)で挫折する人が多いと言っています。
僕はこの壁を突破したいと考えているのですが、何か良い本を教えて頂ければ、と思います。お願いします。

また、タイトルの「rubyに鞍替えするか」という点についてですが、「rubyは分かりやすい。C言語は教える学ぶに向いてない為、rubyでプログラミングを学習してからC言語に進んだ方が理解が早い。」という意見も聞いた為です。
ですが、前回の質問では「for文多重ループぐらいのはどこの言語でも出てくるからC言語を頑張れ。」というニュアンスの答えを頂いたのでどうしたものかと考えています。
自分としては、C言語を頑張りたいのが7で、rubyに鞍替えした方がいいのだろうかというのが3といった所です。
軽く検索した所、rubyにも再帰やビット演算などは有るみたいですし、少し迷いが有ります。
rubyをやってみた方が良いでしょうか?こちらも回答してくださると有り難いです。
個人的にはこのままC言語1本で行けたらなぁ、とは思います。

ちなみにまず母親に相談した所「ネットで聞いて。本屋に行くとしても次の水曜日ね。」と言われました。
実際に本屋で本の中身を見て買いたいという思いも有ります。(今まではAmazonで購入していました。

ご教授、何卒よろしくお願い致します。

現在、二度目の挫折を経て再びC言語を学習しています。趣味としてやっています。
前回も教えてgoo様で質問させて頂いたのですが(https://oshiete.goo.ne.jp/qa/9256426.html)、今回も質問させて頂きたいと思い書いています。

「新・明解C言語入門編」で勉強しているのですが、どうしてもfor文多重ループが分かりません。
ネットでも検索してみたりはしたのですが、いまいち良く分かりません。
具体的に書くと、P100の演習4-20は答えを見て得心がいき解けるようになりました。演習4-21,演習4-22は解けまし...続きを読む

Aベストアンサー

>「C言語ポインタ完全制覇 著者:前橋 和弥」
>「C言語による最新アルゴリズム事典 著者:奥村 晴彦」
>「C実践プログラミング 第3版 Steve Oualline (著), 望月 康司 (監訳) (翻訳), 谷口 功 (翻訳)」

2番目はCというよりアルゴリズムの本ですね。
1、3番目は中級者向けでしょう。いきなりポインタに手を
出さない方が良いでしょう。

forの多重ループで頭が真っ白になってしまうレベルの超初心者が
読む本ではありませんね。

まず、ごくごく簡単な言語で、簡単な仕様のプログラムを
ポツポツ試してゆくしかないでしょう。

個人的にはpythonあたりをお勧めしたい。

QC++で大量のエラーが出る

下記で、大量のエラーが出る。
//C:/Users/usui/perl/LWP/170220-Iterative_processing/html/01.cpp {{{
#include <iostream>
#include <string>
#include <unistd.h>
#include <stdlib.h>

using namespace std; // }}}

class filter{
private:
int ret;
DIR *dir;
struct dirent *dp;
char path[]=".";
int ret;
string name;
public:
// コンストラクター
filter(string s){
name = s;
const char* cstr = name.c_str();
ret=chdir(cstr);
if(ret!=0){
cout << "chdirに失敗\n" << name <<endl;
exit(1);
}
//ret=chdir(path);
if((dir=opendir(path))==NULL){
perror("opendir");
exit(-1);
}

for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)){
if(strlen(dp->d_name)>10){
printf("<target>%s</target>\n",dp->d_name);
read_file(dp->d_name);
}
}
};
int main(){
filter dekita("C:/Users/usui/perl/LWP/170220-Iterative_processing/html");
}

// vim:set ft=cpp fdm=marker:

エラーの内容は下記。

01.cpp:12:2: error: 'DIR' does not name a type
DIR *dir;
^
01.cpp:14:15: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
char path[]=".";
^
01.cpp:15:6: error: redeclaration of 'int filter::ret'
int ret;
^
01.cpp:11:6: note: previous declaration 'int filter::ret'
int ret;
^
01.cpp:42:2: error: expected '}' at end of input
}
^
01.cpp:14:15: error: initializer-string for array of chars is too long [-fpermissive]
char path[]=".";
^
01.cpp: In constructor 'filter::filter(std::string)':
01.cpp:19:19: error: array used as initializer
filter(string s){
^
01.cpp:28:6: error: 'dir' was not declared in this scope
if((dir=opendir(path))==NULL){
^
01.cpp:28:22: error: 'opendir' was not declared in this scope
if((dir=opendir(path))==NULL){
^
01.cpp:29:19: error: 'perror' was not declared in this scope
perror("opendir");
^
01.cpp:33:17: error: 'dir' was not declared in this scope
for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)){
^
01.cpp:33:20: error: 'readdir' was not declared in this scope
for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)){
^
01.cpp:34:15: error: invalid use of incomplete type 'struct dirent'
if(strlen(dp->d_name)>10){
^
01.cpp:13:9: error: forward declaration of 'struct dirent'
struct dirent *dp;
^
01.cpp:34:23: error: 'strlen' was not declared in this scope
if(strlen(dp->d_name)>10){
^
01.cpp:35:38: error: invalid use of incomplete type 'struct dirent'
printf("<target>%s</target>\n",dp->d_name);
^
01.cpp:13:9: error: forward declaration of 'struct dirent'
struct dirent *dp;
^
01.cpp:35:46: error: 'printf' was not declared in this scope
printf("<target>%s</target>\n",dp->d_name);
^
01.cpp:36:16: error: invalid use of incomplete type 'struct dirent'
read_file(dp->d_name);
^
01.cpp:13:9: error: forward declaration of 'struct dirent'
struct dirent *dp;
^
01.cpp:36:24: error: 'read_file' was not declared in this scope
read_file(dp->d_name);
^
01.cpp: At global scope:
01.cpp:42:2: error: expected unqualified-id at end of input
}
^
どうも、CとC++では、関数の名前とかが違う様だが。済みません。間違いの
指摘をお願いします。

下記で、大量のエラーが出る。
//C:/Users/usui/perl/LWP/170220-Iterative_processing/html/01.cpp {{{
#include <iostream>
#include <string>
#include <unistd.h>
#include <stdlib.h>

using namespace std; // }}}

class filter{
private:
int ret;
DIR *dir;
struct dirent *dp;
char path[]=".";
int ret;
string name;
public:
// コンストラクター
filter(string s){
name = s;
const char* cstr = name.c_str();
ret=chdir(cstr);
if(ret!=0){
cout...続きを読む

Aベストアンサー

基本的には、コンストラクタの中で、static でない変数を初期化することは禁止されています(最初のメッセージは、警告メッセージで、C++11 の新規格なら許されると言うことです)

あと、C++であてtも、char path[] という配列を初期化することはできません。

ということです。

QC言語の簡単なプログラムの相談です

プログラミング初心者です。
getcharが使えなくて
困っています。
下記プログラムに"#define putchar(c) putc(c, stdout)"と”#define getchar( ) getc(stdin)”も加えたりしているのですが、結果"。"や"1"などがでてきます。(下はサンプルプログラムです)
どなたか、ご教授よろしくお願いします。





#include <stdio.h>

void main(void);

void main(void)
{
int c;

for (c = 'A'; c <= 'Z'; c++) /* c の値は 'A' から 'Z' まで変化 */
putchar(c); /* 1文字画面に出力 */

printf("\n");

for (c = 'Z'; c >= 'A'; c--) /* c の値は 'Z' から 'A' まで変化 */
putchar(c); /* 1文字画面に出力 */

printf("\n\n");

printf("アルファベットを入力して下さい\n");
printf("eを入力するとループからぬけます\t");

while ((c = getchar( )) != EOF) { /* 文字の入力 */
putchar(c);
if (c == 'e') /* 入力された文字が 'e' なら */
break; /* ループから抜ける */
}
}

プログラミング初心者です。
getcharが使えなくて
困っています。
下記プログラムに"#define putchar(c) putc(c, stdout)"と”#define getchar( ) getc(stdin)”も加えたりしているのですが、結果"。"や"1"などがでてきます。(下はサンプルプログラムです)
どなたか、ご教授よろしくお願いします。





#include <stdio.h>

void main(void);

void main(void)
{
int c;

for (c = 'A'; c <= 'Z'; c++) /* c の値は 'A' から 'Z' まで変化 */
putchar(c); ...続きを読む

Aベストアンサー

#Codeが
https://www.microsoft.com/ja-jp/store/p/code/9nblggh4s3mf
これだとすると

> #Code is an online compiler

ってあるから、最近流行りの paizaとかideoneとかみたいな感じなのではないでしょうか。
だとすると、入力は、通常のオフラインでの実行とは違っていても不思議ではありません。

Qしつこい様ですが、再度ポインタについて質問します。

下記は、*inの<title>から<と>で挟まれたtitle
を得るためのソースです。
全くの完全では有りませんが。質問の内容は、
while文の中で、コンパイラーが出すエラーメッセージの
内容が理解出来ません。

下記が出ます。
01.c: In function 'main':
01.c:12:17: warning: assignment makes pointer from integer without a cast [enabled by default]
while(strstr((p=(*out++ = *in++)),">") !=0);
^
while文の中でのエラーで、キャスト無しの整数からポインターを作っているので
strstrの最初の引数を飛ばしました(デフォルトで有効)無視しました。と言う意味ですが。

要はこれはポインターで無いのでstrstrの引数としては無効ですと言う事でしょうか。
それであれば、ここではポインターに変換しないといけませんが。

実はこれに関しては、前の質問でその方法と言うのは分かったのですが。どうしても、ここでは
将来の勉強と言う意味で理解をしたかった物ですから質問をしました。

このエラーメッセージが出ない様にするためにはソースのどこを変更
すれば良いのでしょうか。今度は、コードがどうのこうのではなくて
説明をお願いします。

よろしくお願いします。後学の為にどうしても理屈を知りたかった物ですから。
宜しくお願いします。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char *in="<title>";

char work[256];
char *out=work;
char *p;

while(strstr((p=(*out++ = *in++)),">") !=0);
*out='\0';
printf("%s",work);

return 0;
}

下記は、*inの<title>から<と>で挟まれたtitle
を得るためのソースです。
全くの完全では有りませんが。質問の内容は、
while文の中で、コンパイラーが出すエラーメッセージの
内容が理解出来ません。

下記が出ます。
01.c: In function 'main':
01.c:12:17: warning: assignment makes pointer from integer without a cast [enabled by default]
while(strstr((p=(*out++ = *in++)),">") !=0);
^
while文の中でのエラーで、キャスト無しの整数からポイ...続きを読む

Aベストアンサー

No1です。
>これを作るに当ってのプログラム作成の問題は解決をしていますので。
>最後に今回の説明の回答で暴走すると言う所が気になっています。
>最後にこの暴走と言う所の質問の回答をお待ちしています。

これを以下のような部分を追加しました。
追加したしたのは、変数の内容を印字するだけなので、本来の動作には影響しません。
--------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char *in="<title>";

char work[256];
char *out=work;
char *p;

printf("ascii code of(<)=%d\n",'<');
printf("in_size=%d out_sieze=%d\n",sizeof(in),sizeof(out));
printf("in=%x out=%x\n",in,out);

while(strstr((p=(char*)(int)(*out++ = *in++)),">") != 0);
*out='\0';
printf("%s",work);

return 0;
}
----------------------------------
これを実行すると、添付の図のようになります。
OSにより強制終了させられます。
このように強制終了させられる原因はいろいろありますが、今回は
ROM領域をアクセスしているのが原因と考えられます。
まず、pのあたいですが、"<"のアスキーコードの値:60が設定されます。
strstr(p,">")の意味は、60番地から">"の文字列が存在する箇所を探しなさい。
ということになります。60番地はROMの領域になるはずで、OSはこのような領域を一介のアプリプログラムが
アクセスすることを禁止しています。その為、強制終了させられます。(これが暴走の意味です)
通常、pは、アプリケーションプログラムが確保した領域のアドレスが設定されるはずで、
inのアドレスが設定されるなら、添付の図のように403064(16進数)のような値になるはずです。

No1です。
>これを作るに当ってのプログラム作成の問題は解決をしていますので。
>最後に今回の説明の回答で暴走すると言う所が気になっています。
>最後にこの暴走と言う所の質問の回答をお待ちしています。

これを以下のような部分を追加しました。
追加したしたのは、変数の内容を印字するだけなので、本来の動作には影響しません。
--------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char *in="<title>";

char work[256];
char *out=wo...続きを読む


人気Q&Aランキング