C言語なら俺に聞け( ..
2:デフォルトの名無しさん
07/02/20 14:30:24
2だ〜
プログラミング勉強しようと思う新1大学生何だけどお薦めの本教えてください。
勉強する順序ってC→C++でいいの?
3:デフォルトの名無しさん
07/02/20 14:34:48
順序は目的次第。
C言語よりC++を先に習っても問題ないですか?
スレリンク(tech板)l50
4:デフォルトの名無しさん
07/02/20 14:56:55
プログラムを面白く習うならCよりもC++の方が書籍が充実してるなぁ。
小林健一郎や、米村貴裕の本はおもしろい。
5:デフォルトの名無しさん
07/02/20 15:07:09
↑の2人ってC言語の本は書いてないの?
出版社は翔泳社がいいっていわれたんだけど・・・
6:デフォルトの名無しさん
07/02/20 15:14:55
C言語からやったほうがC++の理論をより深く理解できるんじゃないか?
たいしてプログラミングやったことないのにオブジェクト指向学んでもなぁ・・・
7:デフォルトの名無しさん
07/02/20 17:16:43
C++は基本以外にいろいろあるから
Cで基本を押さえてからのほうがいいと思うよ
8:デフォルトの名無しさん
07/02/20 18:34:42
C99は後回しでもおk?
9:デフォルトの名無しさん
07/02/20 18:44:40
何が言いたいのかわからん
10:デフォルトの名無しさん
07/02/20 18:55:53
C言語からC++に移るのって簡単?
11:デフォルトの名無しさん
07/02/20 19:13:48
CのようにしかC++を使わないのなら簡単。
が、拡張された機能を使おうとすると大変。
増改築を繰り返して迷路になってしまった旅館って感じの言語仕様だからね。
12:デフォルトの名無しさん
07/02/20 20:07:05
迷路っていうかからくり屋敷って感じだ
13:デフォルトの名無しさん
07/02/20 20:49:01
ああゲーム作りてえ卒論とかマジうぜえゲームを作る時間を俺にくれええ
14:デフォルトの名無しさん
07/02/20 20:49:37
すいません
18年度 第3回
C言語プログラミング能力認定試験 の問題なんですが 解答を教えて下さいm(_ _)m
問6(プログラム説明)
入力した文字列の英大文字を英小文字に 英小文字を英大文字に変換し 表示する(省略)
(アルゴリズム)
@文字列を入力する
A入力された文字列の文字を1字ずつ変換し 出力領域に代入する
英大文字であれば 英小文字に変換し 出力領域に代入する
英小文字であれば 英大文字に変換し 出力領域に代入する
それ以外の文字であれば そのまま出力領域に代入する
B出力領域の内容を表示する
(実行結果)
文字列を入力して下さい Iam21YearsOld
iAM21yEARSoLD
すいません長くて.. プログラムは次です
15:デフォルトの名無しさん
07/02/20 20:53:34
宿題スレというのがあるからそこで聞くといいよ
16:デフォルトの名無しさん
07/02/20 21:30:24
(プログラム)
/* 大文字・小文字の変換 */
#include <stdio.h>
#include <ctype.h>
main()
{
char str_i[256]、 str_o[256];
int i、j;
/* データ入力 */
printf("文字列を入力して下さい");
scanf("%s"、str_i);
/* 変換 */
for(i=0、j=0;str_i[i] != '\0';i++){
if(isupper(str_i[i]))
str_o[j++]= 【38】;
else if(【39】)
str_o[j++] = 【40】;
else
str_o[j++] = 【41】;
}
【42】;
printf("%s"、str_o);
}
17:デフォルトの名無しさん
07/02/20 21:31:46
【38】の解答群
ア tolower(str_i[i]) イ tolower(str_o[j]) ウ toupper(str_i[i]) エ toupper(str_o[j])
【39】の解答群
ア isalnum(str_i[i]) イ isalpha(str_i[i]) ウ islower(str_i[i]) エ isupper(str_i[i])
【40】の解答群
ア tolower(str_i[i]) イ tolower(str_o[j]) ウ toupper(str_i[i]) エ toupper(str_o[j])
【41】の解答群
ア str_i[i] イ str_i[++i] ウ str_i[i++] エ str_i[j++]
【42】の解答群
ア str_o[--j] = '\0' イ str_o[++j] = '\0' ウ str_o[j] = '\0' エ str_o[j+1] = '\0'
以上です
携帯から長々とすいませんm(_ _)m 【38】〜【42】の答えを教えて下さいm(_ _)m
18:デフォルトの名無しさん
07/02/20 21:32:47
C/C++の宿題を片付けます 83代目
スレリンク(tech板)
19:デフォルトの名無しさん
07/02/20 21:38:21
>>14
38. ア
39. ア,イ,ウ
40. ウ
41. ア
42. ウ
20:デフォルトの名無しさん
07/02/20 21:49:01
>>16
C始めて1週間だけど多分できた。islowerとASCLLコードを使うんじゃないかな?
【42】;のところは何も書かないでも出来ちゃったけど
21:デフォルトの名無しさん
07/02/20 21:52:02
リロードしてなかった(´・ω・`)
選択肢にないのを記述してた…
22:デフォルトの名無しさん
07/02/20 21:58:41
低レベルエスパー
>>20
○ ascii
× ascll
23:デフォルトの名無しさん
07/02/20 22:04:38
>>22
書き込んでから気づいた
ハジカシス
24:デフォルトの名無しさん
07/02/20 22:22:59
16 の問題を書いた者ですm(_ _)m
すいません どこか間違いらしきとことかありますかね?
19さんの解答で当たってますか?
【39】は どれも当てはまるという事なんですかね?
もう一回プログラムを確認してみます
25:デフォルトの名無しさん
07/02/20 22:27:09
1つ言うと「、」じゃなくて「,」
26:デフォルトの名無しさん
07/02/20 22:32:15
そうですか 間違いすいませんm(_ _)m
プログラム自体は間違い無いですかね
要は 入力された文字列を 大文字から小文字 小文字から大文字 に変換するプログラムなんですけど
ウは 2つ正解があるんですかね?
【39】はどうなんだろう...
27:デフォルトの名無しさん
07/02/20 22:37:34
だから宿題スレに行けってのに何スルーしてんだコラ
28:デフォルトの名無しさん
07/02/20 22:38:37
C言語よりまず先にマナーを勉強するべきだと思う
29:デフォルトの名無しさん
07/02/20 22:45:34
問題としてはウが正解なんだろうけど、アとイでも実行結果は同じになる。
30:デフォルトの名無しさん
07/02/20 23:17:10
宿題スレに書かなくて大変すいませんでしたm(_ _)m
ウは3つ正解ですか??
31:デフォルトの名無しさん
07/02/20 23:20:22
ウは選択肢であって設問ではないから、「ウは3つ正解ですか???」というのは
日本語としておかしい。
32:デフォルトの名無しさん
07/02/20 23:23:23
解答を全部ウにしたら3つ正解ってことじゃね?
33:デフォルトの名無しさん
07/02/20 23:24:39
釣りか
34:デフォルトの名無しさん
07/02/20 23:47:20
実は >32さんの言う通りで
答えを全部ウにしました... 3つ正解だといいんだけど..
35:デフォルトの名無しさん
07/02/21 00:25:53
全部不正解ならいいのに
36:デフォルトの名無しさん
07/02/21 00:29:56
#include <stdio.h>
#include <string>
typedef struct _CALORIE{
char name[40];
float value;
} CALORIE;
int calregist(CALORIE *, int);
float calcalc(CALORIE *, int);
int main(){
CALORIE cal[500] = {
{"米飯", 150.3}, {"中華麺", 57.1},
{"蕎麦", 133.3}, {"うどん", 100.0},
{"素麺", 133.3}, {"食パン", 250.3}
};
int cal_num = 6;
int mode = 0;
printf("カロリー計算ツール\n");
37:デフォルトの名無しさん
07/02/21 00:30:31
while(1){
printf("登録は1を、計算は2を、終了は0を入力して下さい : ");
scanf("%d", &mode);
if(mode == 0)
break;
else if(mode == 1)
cal_num = calregist(cal, cal_num);
else if(mode == 2)
printf("総カロリー:%6.2fkcal\n\n", calcalc(cal, cal_num));
}
return 0;
}
/************************************
calregist() カロリーリストへ登録する
[引数] pcal -- カロリーリストへのポインタ
num -- 登録前のリストの要素数
[戻り値] 登録後のリストへの要素数
*************************************/
int calregist(CALORIE *pcal, int num){
printf("食品名を入力して下さい : ");
scanf("%s", (pcal+num)->name);
printf("その食品のカロリーを入力して下さい。[kcal/100g] : ");
scanf("%f", &((pcal+num)->value));
printf("登録しました。\n\n");
return num+1;
}
38:デフォルトの名無しさん
07/02/21 00:31:09
/************************************
calcalc() カロリーを計算する
[引数] pcal -- カロリーリストへのポインタ
num -- リストの要素数
[戻り値] カロリー数
*************************************/
float calcalc(CALORIE *pcal, int num){
char name[40]; /* 入力した食品名 */
float gram; /* 入力したグラム数 */
float totalcal = 0.0; /* 合計カロリー */
int i;
printf("--食品一覧----------\n");
for(i=0; i<num; i++)
printf("%s\t", (pcal+i)->name);
printf("\n-------------------\n");
while(1){
printf("食品名(endで計算) : ");
scanf("%s", name);
if(strcmp(name, "end") == 0)
break;
printf("グラム数 : ");
scanf("%f", &gram);
for(i=0; i<num;; i++){
if(strcmp(name, (pcal+i)->name) == 0){
totalcal += (pcal+i)->value * gram / 100.0;
break;
}
}
}
return totalcal;
39:デフォルトの名無しさん
07/02/21 00:32:25
}
c:\source>bcc32 CL.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
sample21.c:
エラー E2188 sample21.c 74: 式の構文エラー(関数 calcalc )
エラー E2379 sample21.c 74: ステートメントにセミコロン(;)がない(関数 calcalc
)
*** 2 errors in Compile ***
エラーの解決ができませんので、ご指摘お願い致します。
40:デフォルトの名無しさん
07/02/21 00:37:02
>for(i=0; i<num;; i++){
41:デフォルトの名無しさん
07/02/21 00:38:45
> #include <string>
#include <string.h>
ちゃんとコンパイルかけたソースそのまま貼ったか?
> for(i=0; i<num;; i++){
for(i=0; i<num; i++){
BCC って不親切なエラーメッセージ出すな。
42:デフォルトの名無しさん
07/02/21 00:39:10
長いのはどっかのうpローダーに上げた方がいいと思う
43:デフォルトの名無しさん
07/02/21 00:45:31
TIFFファイルを解析して表示させるプログラムのサンプルってどこかにないでしょうか。
ググって探してみたんだけど、どこにも…。
44:デフォルトの名無しさん
07/02/21 00:49:04
>>43
libtiffに不満があって自分で作っちゃおうって人?
45:43
07/02/21 00:59:00
>>44
libtiffは知らなかった…。
見た感じ不満はなさそうなんだけど、
ただ、出来れば標準ライブラリ以外は使いたくないと思ってて。
46:デフォルトの名無しさん
07/02/21 01:08:44
>>45
自力でtiffを解析するサンプルを載せてるようなサイトはあまりないかも。
となると、tiffの仕様を読んで自分で作るしかないような。
tiffの仕様はlibtiffのサイトから辿れるよ。
47:デフォルトの名無しさん
07/02/21 01:17:16
つーか、libtiffをサンプルとするのに何が不満なんだろう。
48:デフォルトの名無しさん
07/02/21 01:17:18
文末にセミコロン;つけるときとつけないときがあるよね?つけるときが多いけど。
それのつけるときとつけないときってどう違うの?イマイチわからない。凄く初歩的でごめん。
49:デフォルトの名無しさん
07/02/21 01:20:24
>>48
適当にソースを眺めてれば、規則性がわかるんじゃね?
50:デフォルトの名無しさん
07/02/21 01:21:10
>>48
日本語で例えると、
読点:「,」→「、」
句点:「;」→「。」
てな対応になってる。
51:デフォルトの名無しさん
07/02/21 01:21:12
libtiffをサンプルにするならlibtiffを使えばいいじゃん
libtiffからソースをパクって使うってことかね
52:デフォルトの名無しさん
07/02/21 01:21:14
文の終わりにはセミコロンがつきます
53:デフォルトの名無しさん
07/02/21 01:21:37
文末には必ずつける。以上。
但し、プリプロセッサディレクティブは文ではない。
54:デフォルトの名無しさん
07/02/21 01:22:37
> 文末にセミコロン;つけるときとつけないときがあるよね?
んなこたあない。
文末を表す記号がセミコロンだ。
55:デフォルトの名無しさん
07/02/21 01:23:53
もしかして:Pascal
56:デフォルトの名無しさん
07/02/21 01:25:15
ブロックの後ろにはつけないから、それを言ってるんじゃね?
57:デフォルトの名無しさん
07/02/21 01:30:34
C言語の構造は、
式文→式;
複文→{ 複数の文 }
if文→if (式) 文
while文→while (式) 文
関数定義→いろいろ宣言 文
のように文法的にどういう形になるか決められていて、
それによって;がいるか要らないかは判断できる。
58:デフォルトの名無しさん
07/02/21 01:31:16
ごめん書き方がわるかった。
>>56
多分それだ。ブロックって言うと・・・例えばどんなのだっけ。
59:デフォルトの名無しさん
07/02/21 01:43:18
ヘッダファイルって#defineの集まりだと思っていい?
60:43
07/02/21 01:43:34
>>46
ありがとう。
その辺から辿ってみるよ。
>>47
別に不満はないよ。
ただ、存在を知らなかったってだけ。
61:デフォルトの名無しさん
07/02/21 01:43:44
>>59
よくない
62:デフォルトの名無しさん
07/02/21 01:44:22
>>58
>>57で言うと、複文のこと。
63:36
07/02/21 01:45:36
>>40
できますた、ありがとうございました。。
>>42
やり方がわかりませんでした。
64:デフォルトの名無しさん
07/02/21 01:50:36
>>58
例えばこんなのが不自然とかは分かるのか?
if (条件式);
処理;
for (i=0; i<N; i++) {
処理1;
処理2;
};
65:デフォルトの名無しさん
07/02/21 01:59:53
>>64
あ、なるほど。さすがにそれはわかる。
要するに文の途中だから;は入れれないとかそういうやつか。
66:デフォルトの名無しさん
07/02/21 02:06:29
>>64
ifの方は不自然とかいう問題以前のような気がする。
67:デフォルトの名無しさん
07/02/21 02:12:26
不自然ではないがナンセンスだな
68:デフォルトの名無しさん
07/02/21 02:13:43
>>65
> 文の途中だから;は入れれない
>>64はどっちも文法上は正しいコードだぞ
69:デフォルトの名無しさん
07/02/21 02:17:17
if (条件式); if文で何も処理しない
処理; 普通の文
for (i=0; i<N; i++) { ありがちなN回ループ
処理1;
処理2;
}; ループ後に何もしない処理
70:デフォルトの名無しさん
07/02/21 02:20:27
;だけからなる空文(なにもしない)というものがある。
if (式); は、if (式) 文 の文の部分が;だけからなる空文
if (式) { ... };は、ifに支配されている文は {...} で終わり、そのあとに
if文の次に評価される空文が1つついている解釈になる。
いずれも、文法的には正しい。
式の評価自体に繰り返す意味があって、それ以上実行する必要がある
ものがない場合は、
while (式) ;
のようなループ制御文の文が空文になることも実際にある。
71:デフォルトの名無しさん
07/02/21 02:22:58
>>70のような;は見落としやすいので、
while (式)
;
のようにぽつんと単独で目立つように書くのがいい。
72:デフォルトの名無しさん
07/02/21 02:36:42
{ 〜〜〜〜〜
while (式) ;
}
はwhile (式) ;から}までを繰り返すってこと?
73:デフォルトの名無しさん
07/02/21 02:40:49
('A`)エー
while (条件式) {
処理1;
処理2;
…
処理N;
}
条件式が真の間のみ、処理1〜Nを繰り返す
なんか参考書とか買って嫁
74:デフォルトの名無しさん
07/02/21 02:41:30
>>72
ブロックの有無は関係ない。while()は次に続く文を実行するだけ。
75:36
07/02/21 03:04:44
>>num -- 登録前のリストの要素数
これは、どんな感じなのか、イメージが掴めないので
例を出して説明して戴けないでしょうか?
>>return num+1;を返しますが、この+1とは・・・?
ご助言、宜しくお願い致します。
76:デフォルトの名無しさん
07/02/21 03:15:04
>>75
初期状態では6個登録されているようなのでnum = 6 (呼び出し元ではcal_num == 6)
で、登録して要素が一つ増えたからnum+1 (戻ってきてcal_numが事実上1増えた)
77:36
07/02/21 03:22:44
>>76
あ〜っ!そういう事だったんですね。
とてもわかり易い説明、ありがとうございました。
あと、幾ら考えてもわからないのが
>>while(1){
printf("食品名(endで計算) : ");
scanf("%s", name);
if(strcmp(name, "end") == 0)
break;
printf("グラム数 : ");
scanf("%f", &gram);
for(i=0; i<num;; i++){
if(strcmp(name, (pcal+i)->name) == 0){
totalcal += (pcal+i)->value * gram / 100.0;
break;
この中の
>>if(strcmp(name, "end") == 0)
>>printf("グラム数 : ");
scanf("%f", &gram);
for(i=0; i<num;; i++){
if(strcmp(name, (pcal+i)->name) == 0){
totalcal += (pcal+i)->value * gram / 100.0;
break;
この二つです、何を言ってるのやらです。
因みに、>>*gramはポインタでなく、"掛ける"ですよね?
78:デフォルトの名無しさん
07/02/21 03:28:59
strcmpは引数の指しているNUL終端文字配列を比較し、一致すると0を返す。
if(strcmp(name, "end") == 0)
は「nameが"end"だったら」
(pcal+i)->name
は
(*(pcal + i)).name
の略記法であり、結局は
cal[i].name
のこと。
該当するnameのものをforループで探し、
見つかったら( if (strcmp(name, (pcal+i)->name) == 0) )
計算、もう探す必要はないのでbreakする。
79:36
07/02/21 05:02:11
ポインタや引数など理解できてないなで出直してきます
m(__)m
80:デフォルトの名無しさん
07/02/21 06:01:36
>>78
せっかくポインタ使うんだからむしろこうしたほうがいいかも。
for(i=0; i<num; i++){
if(strcmp(name, pcal->name) == 0){
totalcal += pcal->value * gram / 100.0;
break;
}
pcal++;
}
81:デフォルトの名無しさん
07/02/21 15:12:41
返却値に何も記入しないで
return;
とすると1が戻ってきますが、これはJISとかISOで規定されているのでしょうか?
82:デフォルトの名無しさん
07/02/21 15:22:09
規定されていない
83:デフォルトの名無しさん
07/02/21 15:52:40
すみません教えてください(;´д⊂)
linuxでwrite()を使ってファイルの書き込みを行なっているのですが、
2G以上のファイルの書き込みを行なおうとハングって落ちちゃいます。
write()では2G以上のファイルは使用できないのでしょうか?
84:デフォルトの名無しさん
07/02/21 15:57:30
>>83
どうやってopenしてる?
85:デフォルトの名無しさん
07/02/21 15:58:46
2Gなら64bit APIは関係ないし、単に32bit-signed intが負になってるだけじゃ?
86:デフォルトの名無しさん
07/02/21 16:13:30
>>84
open()はこんな感じで行なってます。
INT64 fd = open(path, O_CREAT|O_RDWR|O_EXCL, S_IRUSR|S_IWUSR);
87:デフォルトの名無しさん
07/02/21 16:22:07
#include <stdio.h>
int main(void)
{
int ch;
FILE *sfp, *dfp;
char sname[64], dname[64]; /* ファイル名 */
printf("コピー元ファイル名:"); scanf("%s", sname);
printf("コピー先ファイル名:"); scanf("%s", dname);
if ((sfp = fopen(sname, "r")) == NULL) /* コピー元をオープン */
printf("\aコピー元ファイルをオープンできません。\n");
else {
if ((dfp = fopen(dname, "w")) == NULL) /* コピー先をオープン */
printf("\aコピー先ファイルをオープンできません。\n");
else {
while ((ch = fgetc(sfp)) != EOF)
fputc(ch, dfp);
fclose(dfp); /* コピー先をクローズ */
}
fclose(sfp); /* コピー元をクローズ */
}
return (0);
}
コピー先のファイルを fileB.c などと拡張子を付けるとうまく生成されません。
拡張子を付けて出力する為にはどのようにすればよいのでしょうか?><
88:デフォルトの名無しさん
07/02/21 16:24:26
ファイルポインタは正負あるし、2Gオーバーだと64bit必要。
#define _LARGEFILE_SOURCE
だったっけ。
89:デフォルトの名無しさん
07/02/21 16:26:01
>>87
黙って終わってしまい何もコピーできてないのか、
何かエラーがでるのか、それくらい書いてよ。
90:87
07/02/21 16:29:12
さらに上記のプログラムをもとに、すべての英小文字を英大文字に変換しながらコピーするプログラムを作成せよとのお題が出ました。
これはASCIIコードから操作すべきなのでしょうか?
91:デフォルトの名無しさん
07/02/21 16:32:02
>>90
#include <ctype.h>
islower
toupper
92:87
07/02/21 16:34:00
>>89殿
拡張子抜きのファイルは確かに作れるんですが、
.txtだとか.c といった風に拡張子を付けると駄目になります。;
エラーは自分で書いた、「コピー先ファイルをオープンできません」が出ます。
93:87
07/02/21 16:36:55
>>91殿
K&R、202ページにて発見いたしました。これから読もうと思います。ありがとうございました。
94:83
07/02/21 16:38:47
>>88
#define _LARGEFILE_SOURCE
は指定しています。
ちょっと調べまして、
#define _FILE_OFFSET_BITS 64
も入れてみましたが結果は変わらずです。(´・ω・`)
95:デフォルトの名無しさん
07/02/21 16:40:38
>コピー先のファイルを fileB.c などと拡張子を付けるとうまく生成されません。
>>87をコピペしてコンパイルしたけどできたよ。エラーでないよ。
96:デフォルトの名無しさん
07/02/21 16:41:02
>>92
errnoでも調べとけよ
97:デフォルトの名無しさん
07/02/21 16:42:17
ファイルの20バイト目に文字列を挿入するようなプログラムを考えているのですが、
ファイルを丸ごとプログラムで読み込むようなことをしないで
実行するような方法はないでしょうか?
98:デフォルトの名無しさん
07/02/21 16:42:44
>>94
open64とか使わなくていいんだっけ?
99:デフォルトの名無しさん
07/02/21 16:43:42
可能性
1. ファイル名に出来ない文字を打った ,カンマ と .ピリオド 間違い等(いつもと違うキーボード使ってるなら)
2. ファイル名の長さ制限に引っかかった
100:87
07/02/21 16:46:48
>>95
できた;おれも試したらできました。よかった;;
101:87
07/02/21 16:48:42
>ファイルの20バイト目に文字列を挿入するようなプログラムを考えているのですが、
>
>ファイルを丸ごとプログラムで読み込むようなことをしないで
>実行するような方法はないでしょうか?
まさかhtmlを埋め込もうとしてる?
102:デフォルトの名無しさん
07/02/21 16:50:39
>>97
fopen "a"
103:デフォルトの名無しさん
07/02/21 16:53:44
>>97
書き込んだ位置以降を後ろにずらしたいなら移植性の高い方法では多分無理。
104:97
07/02/21 17:06:46
>>101
データベースを更新したりするようなプログラムを考えてます。
その際に挿入とかがどうしても必要になってきまして;;
>>103
では、諦めた方がいいのでしょうか;
今ところ、
作業ファイルのようなものを仮に作成して、
その中でDBをいじって、
更新するときに、作業ファイルを丸ごと元ファイルに書き込むことを考えてますけど、
これくらいが、一番安定でしょうか?
105:デフォルトの名無しさん
07/02/21 17:30:52
最後に作業ファイルが要らなくなるなら、
作業ファイルを閉じた後、元ファイル名へ名前を変えるだけでいいと思う。
106:97
07/02/21 17:37:13
名前そのものを入れ替え・・・
そうですね そうします
107:デフォルトの名無しさん
07/02/21 19:51:49
>>97
ファイルを全部読まなくてもいいんじゃないか?
1バイト読んで作業ファイルに1バイト書いて、というのを繰り返して
20バイト目に来たら作業ファイル側だけに新たな文字列を書いて、
それが終わったらまた1バイトづつ移して最後にクローズしてリネーム。
但し本当にこの通りに1バイトづつやるのであれば fopen(), getc()
putc() でやること。(open(), read(), write() 使わない方が良い。
バッファリングされないから)。
108:デフォルトの名無しさん
07/02/21 21:32:53
ライブラリってヘッダファイルのこと?
109:デフォルトの名無しさん
07/02/21 21:33:44
再利用するために書かれたプログラム群のこと
110:デフォルトの名無しさん
07/02/21 21:42:09
ヘッダファイルにあるのは関数や変数の宣言。
その定義がライブラリに含まれているという場合もある。
111:デフォルトの名無しさん
07/02/21 21:47:16
>>109-110
ありがとう。でもまだよく分らない(|||´・ω・`)
もうちょっと調べてくる
112:デフォルトの名無しさん
07/02/21 22:59:23
exitと入力されたら終了するようにしたいのですが、これだとexitと入力しても終了されません。
if文では文字列は扱えないのしょうか?
それとも文字列cの最後の\nか\0かに関係がある?
while(1){
char c[10];
printf("exitで終了\n");
fgets(c,sizeof(c),stdin);
if(c == "exit"){
printf("終了します\n");
break;
}
}
113:デフォルトの名無しさん
07/02/21 23:01:56
>>112
>if(c == "exit"){
if(strcmp(c,"exit")==0)
か
if(stricmp(c,"exit")==0)
としる
114:113
07/02/21 23:04:32
>>112
書き忘れたけど
if(c == "exit") だとポインタの比較であって文字列の比較にならない
strcmp か stricmp で比較する
115:デフォルトの名無しさん
07/02/21 23:08:23
"exit\n" じゃないとダメな気がする
116:デフォルトの名無しさん
07/02/21 23:11:06
""は勝手にヌル終端文字に変換されるんじゃなかったっけ?
117:113
07/02/21 23:13:12
>>115
確かに
>>112
↑で
118:デフォルトの名無しさん
07/02/21 23:16:20
ありがとうございます。
if(strcmp(c,"exit\0")==0)
で無事できました。ずっと悩んでたんでかなり助かりました
119:デフォルトの名無しさん
07/02/21 23:16:41
なんてこった\nと\0見間違えたorz
c[strlen(c)-1]='\0';
これで\n消せばいいんじゃね?
120:デフォルトの名無しさん
07/02/21 23:16:41
>>112
#include<stdio.h>
#include<string.h>
int main(void)
{
while(1){
char c[10];
char a[10];
printf("exitで終了\n");
fgets(c,sizeof(c),stdin);
sscanf(c,"%s", a);
if(strcmp(a,"exit") == 0){
printf("終了します\n");
break;
}
}
これで上手くいくと思うよ。俺んとこだと、sscanf を sscanf_s にしろと言われるが、
どっちでもいい。
121:113
07/02/21 23:22:56
>>118
ホントにそれでいけたの?
122:デフォルトの名無しさん
07/02/21 23:24:08
すみません打ち間違えてました\0=\n
ソースの方にはちゃんと\nって打ってた
123:113
07/02/21 23:31:23
>>122
そですか
でも strcmp は大文字小文字を区別します
stricmp の方は大文字小文字を区別しませんのれ
EXIT でもおkにするなら stricmp に変える
124:デフォルトの名無しさん
07/02/21 23:38:14
EOF 打たれたらどうするんだろ
125:デフォルトの名無しさん
07/02/21 23:45:21
引数の値渡しと参照渡しが理解できませんので
簡単に説明お願い致します。特にポインタを使った
参照渡しが解説を読んでもピント来ません。
126:デフォルトの名無しさん
07/02/21 23:55:33
Cって値渡ししかないんじゃなかったっけ?
ポインタを使ってもアドレスという値を渡してるだけだし。
127:デフォルトの名無しさん
07/02/21 23:56:43
URLリンク(www9.plala.or.jp)
(2)2次元配列データの取り扱い方の欄で
int no[3][4]の図解の説明で、どうして
[0][0]は1 no[1][2]は6で足して7になるのでしょうか?
128:デフォルトの名無しさん
07/02/22 00:02:52
>>126
「参照を値渡しする」ことを「参照渡し」と言ってしまう人が多いんだよ。
129:デフォルトの名無しさん
07/02/22 00:03:18
>>125
・文系向け
銀行に行きます。値渡しは行員が貸金庫からお金を出してきてくれます。お金を使える事はできても貸金庫内は弄れません。
参照渡しは行員が貸金庫の場所を教えてくれます。中身が何であろうと、どう使おうと自由です。
・理系向け
値渡しが変数のアドレスに格納されている値を関数に渡すのに対し、
参照渡しは変数のアドレスを渡します。アドレス値そのものの書き換えはできなくても
ポインタが指す値や配列などの前後の値を自由に読み書きできます。
実質的にはポインタを渡す場合は、
変数の内容を書き換えしたいときか、配列・文字列を扱うとき、構造体などの大きなデータを渡すとき
などです
130:デフォルトの名無しさん
07/02/22 00:04:30
>>127
1と6を足したら7だと思うが、どうなると思ったの?
131:デフォルトの名無しさん
07/02/22 00:05:13
>>127
1+6=7になるからじゃないのかい?
no[0][0]=1;
no[1][2]=6;
no[2][3]=no[0][0]+no[1][2];
の代わりに、
a=1;
b=2;
c=a+b;
でcになぜ7が入るの?って聞いているようなもの。
132:113
07/02/22 00:05:29
>>125
Cだと参照渡しできません
>>127
1+6 は 7 ですよ
まぁそんなこと聞きたいわけじゃないと思いますけど
もうすこし、解説読んだほうがいいかと
133:デフォルトの名無しさん
07/02/22 00:06:43
>>132
C++では参照という言葉に言語固有の限定した意味があるから、
そこから離れて説明しないといけないぜ。
134:127
07/02/22 00:06:58
>>130
このページの図解では、[0][0]は1 no[1][2]は6
何故[0][0] = 1; no[1][2] = 6;なのかがわからないのです
唯単に宣言しているからでしょうか?
135:デフォルトの名無しさん
07/02/22 00:08:02
代入してるから
136:113
07/02/22 00:11:00
リロード遅れた
>>128
あれま
私はてっきり
void func(int &)
がしたいのかと思ったよ
void func(int *)
ってことかね?
>>133
ちょっと面倒ですね
>>134
例、たとえだと思いますよ
別にno[1][0] = 1; no[1][3] = 6; no[0][2]=no[1][0] + no[1][3] 、でも良かったんだと思います
137:125
07/02/22 00:14:15
>>129
わかりやすい説明、ありがとうございます
>ポインタが指す値や配列などの前後の値を自由に読み書きできます。
>変数の内容を書き換えしたいときか
これの内容について、更に解説戴けると幸いです。
138:127
07/02/22 00:16:01
ありがとうございました、皆さん
139:デフォルトの名無しさん
07/02/22 00:25:42
>>136
ここはいちおうC言語スレなんで
140:113
07/02/22 00:32:15
>>139
どちら様?
141:デフォルトの名無しさん
07/02/22 00:52:56
今月すごい暇だからCを学ぼうと思うんだけど
何からはじめたら良い?
142:デフォルトの名無しさん
07/02/22 00:57:23
あと一週間しかないじゃん
143:デフォルトの名無しさん
07/02/22 01:00:55
今月は凄い暇だけど来月は割と暇
本当にやることないからちょっと齧ろうと思うんだけど甘いか?
144:デフォルトの名無しさん
07/02/22 01:04:46
とりあえず、入門サイトをググって最低限の環境整えてやってみろ
で、面白ければ(多分無い)もしくは嫌いではなければ入門書買うなりなんなりと
145:デフォルトの名無しさん
07/02/22 01:08:26
>>143
いや、そんなことはない。
一週間超暇でCの学習に集中するなら、かなり進むことができる。
いい参考文書、いい先達、モチベーションの強固な維持、そして少しのプログラミングセンスがあれば。
146:デフォルトの名無しさん
07/02/22 01:12:49
>>141
学生?
なんとなくでも「こんなことしてみたい」って目標があるならまだしも
とりあえず、だと飽きると思うな……
他のプログラミング言語の経験があるなら全く問題なく出来るとは思うけど。
寧ろ、「エクセルでできる〜」とか「エクセルでわかる〜」とかで
遊んだ方が為になることも多いかも試練(スレ違いスマソ
147:デフォルトの名無しさん
07/02/22 01:13:55
>>144-145
おk、適当にやってみる
本当にただの思いつきで今までプログラムなんてやったことないから多分続かないけど
ところでオススメの参考書ってある?
148:デフォルトの名無しさん
07/02/22 01:16:10
>>146
一応まだ学生
長い春休みなんだけど遊ぶ人もいないくて暇
どうせだったらこの時間を有意義に使おうとおもって
エクセルからはじめたほうがいいってことかな?
149:デフォルトの名無しさん
07/02/22 01:18:24
すごいな。プログラミングの単位落とした俺でも春休みは遊びまくるってのに。
150:デフォルトの名無しさん
07/02/22 01:21:22
>>147
読んでないけど結城浩のC言語プログラミングレッスン2冊あたりは
どうだろうね。
まー、ここにも行ってみそ。
推薦図書/必読書のためのスレッド PART33
スレリンク(tech板)
151:デフォルトの名無しさん
07/02/22 01:21:46
いや、関連性は一切無い。
たまたま俺がやってて楽しかったからだw
URLリンク(www.amazon.co.jp)
まあVBAは絶対にオススメしないけど。
マジレスすると、Cやって役に立つような職業よりも
エクセルが役に立つ職種が多い気がする
ただそれだけ。
これまでプログラミング経験が無いんだったら、Cは最初には向かないかもしれん。
スレリンク(tech板)
スレリンク(tech板)
152:デフォルトの名無しさん
07/02/22 01:25:26
>>149
マジか
いや遊びまくりたいところなんだけどいつも遊んでた奴がバイトはじめたりなんだかんだで
なんか家でずっと一人でネットばっかやってるのが虚しくなったからさ
>>150
ありがとう、後でじっくり読んでみる
>>151
そうなのか
プログラムっていったらCとかしか聞いたことなかったから解らんかった
初めてやるならなにがいいのかな?
153:デフォルトの名無しさん
07/02/22 01:30:12
>>152
やる気があるならC言語が最適
154:デフォルトの名無しさん
07/02/22 01:36:48
どうせ時間は腐るほどあるので長い目で見てCでもやってみます
みんなありがとう
155:デフォルトの名無しさん
07/02/22 01:43:43
int型数値を3,221のように3桁カンマ区切りで文字列変換してくれる標準関数ってありましたっけ?
なければ自分で作ります
156:デフォルトの名無しさん
07/02/22 01:54:55
printfで'フラグを使える処理系もあるが、標準Cにはない。
157:デフォルトの名無しさん
07/02/22 02:09:19
URLリンク(www9.plala.or.jp)
文字列とポインタがわかりません、説明は読みました
前の変数と配列のポインタは理解できました
>>>10−3.ポインタと文字列
普通ポインタを用いるときには、配列などのアドレスをポインタに設定して用いますが、
文字列の場合には、配列を使わずにメモリ上に取られた文字列のアドレスを
直接ポインタに指定することができます。
これがわかりませんので、解説よろしくお願いいたします。
158:157
07/02/22 02:15:12
因みにポインタのポインタは理解できました(図解を見て)
ポインタと文字列で
>>>>>>10−3.ポインタと文字列
普通ポインタを用いるときには、配列などのアドレスをポインタに設定して用いますが、
文字列の場合には、配列を使わずにメモリ上に取られた文字列のアドレスを
直接ポインタに指定することができます。
これで、普通の"変数や配列のポインタ"と、"ポインタと文字列 "の違いがわかりませんです。
159:デフォルトの名無しさん
07/02/22 02:34:05
変数や配列のポインタ"と"ポインタと文字列の違い
→ ありません。全てアドレス値です。そもそも文字列というのはchar型配列(の先頭のポインタ)
"ABC"みたいのでもメモリ上に変数が作られると考えればいい。文字列は配列なので先頭のポインタを取得すればいい
""で先頭のポインタが取得できるのでポインタ変数にあたかも文字列を代入しているように見える
よってconst char *hoge[N]みたいなので文字列定数の配列が作れます。
160:デフォルトの名無しさん
07/02/22 02:34:35
本来、
int *array = { 1, 2, 3, 4, 5 }; // エラー
こういうことはやったらおこられるが、
文字列ならおkとかそういう意味。
char *p = "ABC"; // おk
別にポインタそのものには違いはない。
161:デフォルトの名無しさん
07/02/22 03:18:34
>>156
サンクス自分で作る
162:デフォルトの名無しさん
07/02/22 03:23:01
>160
その説明だと、
char *p = "ABC";
*p = 'D';
とか平気でやるようになりそうだ。
163:デフォルトの名無しさん
07/02/22 03:32:47
>>157
は前スレの人だな
未だまともな本買わずに、サイトとか見てるのか。
164:デフォルトの名無しさん
07/02/22 03:46:10
>>162
それがダメなのはchar *pが暗黙にconstとして宣言されているからですか?
165:157
07/02/22 03:59:51
>>159->>159
では、大した違いが無く気にせずでいいんですね。
サンクスでした
>>163
良い本が見つからず、どれを買うか悩んでいます
ここで紹介された本は書店では見当たりません
今のところ、上で挙げたサイトが最良です
166:157
07/02/22 04:12:50
>>>配列を使わずにメモリ上に取られた文字列のアドレスを
直接ポインタに指定することができます
この解説が
>>>"ABC"みたいのでもメモリ上に変数が作られると考えればいい。文字列は配列なので先頭のポインタを取得すればいい
""で先頭のポインタが取得できるのでポインタ変数にあたかも文字列を代入しているように見える
>>int *array = { 1, 2, 3, 4, 5 }; // エラー
こういうことはやったらおこられるが、
文字列ならおkとかそういう意味。
char *p = "ABC"; // おk
この二つでいいのですよね?
もう一度だけ、例文を用いて解説して戴けると、ありがたいです。
167:デフォルトの名無しさん
07/02/22 04:13:33
>>164
その場合の挙動が標準規格で未定義だからです。
168:デフォルトの名無しさん
07/02/22 05:02:54
>>167
ありがとうございます。
足を踏み入れてはいけないところに行ってしまったみたいで
ちょっとびびりますた。
169:デフォルトの名無しさん
07/02/22 06:05:45
クリップボードに文字を出力など、クリップボードを弄りたいんですがどうすればいいんでしょうか?
170:デフォルトの名無しさん
07/02/22 06:09:12
>>169
OSは?
171:デフォルトの名無しさん
07/02/22 06:09:34
WinXPです
172:デフォルトの名無しさん
07/02/22 06:10:42
じゃあこっちじゃない?
Win32API質問箱 Build50
スレリンク(tech板)
173:デフォルトの名無しさん
07/02/22 06:14:54
ありがとう。そっちいってきます
174:デフォルトの名無しさん
07/02/22 11:36:45
struct nannka{
char name[20]; char name2; int No; int time; char nurupo[10];・・・・
}
みたいな感じでcharやintなんかがごっちゃになってる構造体を
ポインタ操作か何かで
順番に指定していくことってできますか?
175:デフォルトの名無しさん
07/02/22 11:50:34
構造体を順番に指定するのと、構造体の要素を順番に指定するのは全く違う。
176:デフォルトの名無しさん
07/02/22 11:58:59
>>174
>構造体を順番に指定
struct nannka a, b, c;
struct nannka p[] = {&a, &b, &c};
>構造体の要素を順番に指定
struct nannka a;
void * p[] = {a.name, & a.name2, & a.No, & a.time, a.nurupo};
177:デフォルトの名無しさん
07/02/22 12:13:48
要素の方です。
ありがとうございます。
早速試させていただきます。
178:デフォルトの名無しさん
07/02/22 12:22:01
指定したからと言って何ができるわけでもないことに注意。
179:デフォルトの名無しさん
07/02/22 14:07:52
char name[20]; char name2; int No; int time; char nurupo[10];
こういう型の異なる構造体のメンバにポインタを使って順番にアクセスする意味があるのだろうか?
結局、そのメンバが文字列なのか整数型なのか判断する必要があるわけだし
名前でアクセスしたほうがソースも見やすいと思うけど
180:デフォルトの名無しさん
07/02/22 16:19:21
fgets(buff, sizeof(buff), stdin);
sscanf(buff, "%s", buff);
これは反則技ですか?
181:デフォルトの名無しさん
07/02/22 16:24:40
fgets(buff, sizeof(buff), stdin);
むしろ一般的(?)。これだけで十分だな。最後に\nがくっ付くので注意
182:デフォルトの名無しさん
07/02/22 16:29:03
ごめん、説明が足らんかった。
sscanf(buff, "%s", buff); の方。
同じものにsscanfをしていいのかどうか
183:デフォルトの名無しさん
07/02/22 16:38:44
>>182
領域が重なっていると鼻から悪魔
184:デフォルトの名無しさん
07/02/22 16:49:57
ホワイトスペースで区切りたいってことか?やる意味がよく分からん
185:デフォルトの名無しさん
07/02/22 16:54:47
>>180
反則技
あぶないコーディング
186:デフォルトの名無しさん
07/02/22 16:55:38
改行\nを除きたいだけです
別に buff[strlen(buff)-1] = '\0'; 等でも
やりたい事はできるのだけど、
sscanf使ったらどうなるのかな、って思っただけ。
187:デフォルトの名無しさん
07/02/22 16:56:55
>>182
実用上問題ないけど、かなり危険な気がする
でも、その例が思い浮かばない
ループで\nを取り除いたほうがいい気がする
>>184
\nを取り除きたいんじゃないの?
188:デフォルトの名無しさん
07/02/22 16:59:22
strcpyなんかと同じで、コピー元オブジェクトとコピー先オブジェクトのメモリ領域が重複していている場合の動作は未定義
189:デフォルトの名無しさん
07/02/22 17:38:36
>>186
それやるなら
fgets(buff, sizeof(buff), stdin);
sscanf(buff, "%s", command);
でいいんじゃない?
buffは入力データを格納する領域の名称
入力データを加工したらもうbuffではないでしょう
190:デフォルトの名無しさん
07/02/22 17:58:26
C言語でマルチスレッドを使う方法と
httpsの使い方を教えてください
191:デフォルトの名無しさん
07/02/22 18:19:34
>>190
目的の環境に合わせて適切なライブラリを入手せよ。
C言語自体には、それらの取り扱いは規定されていない。
192:デフォルトの名無しさん
07/02/22 22:33:45
JavaのSystem.CurrentTimeMillies()と同等の関数名を教えてください。
193:デフォルトの名無しさん
07/02/22 22:38:56
標準Cでは秒未満の時刻情報を扱う手段はないが、
#include <time.h>
time_t time(time_t *timer);
194:デフォルトの名無しさん
07/02/23 00:35:51
char *p = "ABC";
と
char [10] = "ABC";
char *p;
p = s;
の違いは何なのでしょうか?
195:デフォルトの名無しさん
07/02/23 00:41:17
>>194
前者はコンパイルができて後者はエラーになってコンパイルが通らない。
196:194
07/02/23 00:42:34
>>195
どうしてなんでしょうか?
同じポインタですよね?
197:デフォルトの名無しさん
07/02/23 00:44:43
>char [10] = "ABC";
↑変数名がないからエラーになる。ポインタは関係ない。
198:デフォルトの名無しさん
07/02/23 00:46:45
そこは s[10] くらいエスパーしたれよw
199:194
07/02/23 00:47:28
訂正
char *p = "ABC";
と
char s[10] = "ABC";
char *p;
p = s;
の違いでした。
200:デフォルトの名無しさん
07/02/23 00:47:29
ワロス
201:デフォルトの名無しさん
07/02/23 00:50:03
>>194
pの指しているものが文字列リテラルか文字配列かの違い。
202:194
07/02/23 00:54:10
>>201
もう少し簡単にお願い致します
”リテラル”、入門書にも載っていません(索引も調べましたが)・・・・
文字列リテラルか文字配列とは・・・?
203:デフォルトの名無しさん
07/02/23 00:56:41
文字列リテラル…変更できないNUL終端文字列
204:デフォルトの名無しさん
07/02/23 00:57:21
>>194
char *p = "ABC"; ←"ABC"という文字列を指しています。普通はこのポインタを介しての変更はしません。
char s[10] = "ABC";
char *p;
p = s; ←今は"ABC"の入った配列の先頭を指しています。指してる配列の中身を変更できます
205:デフォルトの名無しさん
07/02/23 00:58:58
入門書も不親切なのが多い。
記憶クラスやらスコープやらの説明をする前に、変数を宣言すると
メモリ上に型に応じた領域が確保されるというのをちゃんと教えて
くれないといかん。
あと、初期値の設定なんて0/NULLにしておくくらいしか普通使わなく
ないか?
206:194
07/02/23 01:07:15
>>203
>>204
>>205
ありがとうございます
char s[10] = "ABC";
char *p;
p = s;
は、a[0] A を指していて
char *p = "ABC"; pの中に"ABC"が入るって事でしょうか?
207:デフォルトの名無しさん
07/02/23 01:12:00
pはポインタだから、格納できるのはアドレスだけ
あくまで"ABC"っていう文字列リテラルの先頭を指しているだけで、
中に入っているわけじゃない。
こういうのって実行時にプログラムが、どんな風に展開されてるかを
イメージできないと理解しにくいんでない?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5386日前に更新/130 KB
担当:undef