X



C言語なら俺に聞け 148
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (アウアウカー Sacf-slpW)
垢版 |
2018/09/19(水) 17:56:50.83ID:XSTNMnDwa
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/

※前スレ
C言語なら俺に聞け 147
http://mevius.5ch.net/test/read.cgi/tech/1534430162/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0565デフォルトの名無しさん (ワッチョイ d980-A6IM)
垢版 |
2018/10/08(月) 17:37:36.24ID:SHTmPUE+0
ホントな低学歴知恵遅れは
頭悪いことを自信満々でいうから困るわ
0567デフォルトの名無しさん (ワッチョイ d980-A6IM)
垢版 |
2018/10/08(月) 17:47:16.60ID:SHTmPUE+0
それにすら到達してない低学歴知恵遅れが
ドヤってるスレがこの板だからな

マジで低学歴知恵遅れはこの板から排除したほうがいい
有害
0569デフォルトの名無しさん (ワッチョイ d980-A6IM)
垢版 |
2018/10/08(月) 17:50:22.69ID:SHTmPUE+0
HTTPというのは
ハイパーテキストトランスファー プ ロ ト コ ル
だからな

ソケット通信(トランスファープロトコル意識する必要ない)で
HTTPの内容してるだけだ

わかった?
0570デフォルトの名無しさん (ワッチョイ d980-A6IM)
垢版 |
2018/10/08(月) 17:51:32.47ID:SHTmPUE+0
ソケット通信でHTTPの内容をヤリトリしてるのすら分かってないワケだからな
ここまで頭悪いと話にならない
0572デフォルトの名無しさん (ワッチョイ d980-A6IM)
垢版 |
2018/10/08(月) 17:52:10.92ID:SHTmPUE+0
で、低学歴知恵遅れの負けず嫌いは半端ないからな
0573デフォルトの名無しさん (ワッチョイ d980-A6IM)
垢版 |
2018/10/08(月) 17:52:42.31ID:SHTmPUE+0
これ以上語るつもりはない
0576デフォルトの名無しさん (ワッチョイ d881-t36n)
垢版 |
2018/10/08(月) 18:24:47.89ID:wTnfR6Jf0
TCP Transmission Control Protocol
IP   Internet Protocol

トランスポート層 TCP, UDP, DCCP, SCTP, IL, RUDP

似たような言葉はあるが、その表現は見つからないな
並行宇宙のどこかで使っているかもしれないが
ここではなさそうだ
0577デフォルトの名無しさん (ワッチョイ b064-selW)
垢版 |
2018/10/08(月) 18:25:27.11ID:NcWFD+EU0
あー。TCPというのはHTTPよりもう少し下層に位置する概念ってことかな?(合ってるか不安)
俺が作りたいなぁと思ったのは
$ xxx 'example.com'
とやるとブラウザでexample.comにアクセスして「ページのソースを表示する」機能を使ったときのような出力を返すコマンド。
これはTCPクライアントじゃなくてHTTPクライアントか。
0579デフォルトの名無しさん (ワッチョイ b7b3-Ww/X)
垢版 |
2018/10/08(月) 18:29:18.08ID:lYyho1IC0
「トランスファープロトコル」は星の数ほどある「〜転送プロトコル」の用語として使われるけど、トランスファープロトコル単体で使用されてるのは聞いたことないね。
きっとトランスポートプロトコルの間違い。
0581デフォルトの名無しさん (アウアウエー Sa6a-syNg)
垢版 |
2018/10/08(月) 18:42:58.85ID:i8/5B6xca
>>577
まあGETするだけだったらそれこそTCPだけでもいい。
勉強としては、HTTPサーバにtelnetしてGETコマンド(と、いくつかのヘッダ)を打ち込んでみると、イメージがつかめるのではないかと。
0588デフォルトの名無しさん (ワッチョイ 27cc-smg0)
垢版 |
2018/10/13(土) 20:15:38.78ID:mLt7ea1s0
すみません、C言語出テキストファイルの特定行を書き換えたいのですが
全て配列に読み込む→変更する→全て書き戻す
という方向しかないでしょうか。

変更前 01.txt
a=1
b=1
c=1

変更後 01.txt
a=1
b=0
c=1

こういった変更を行いたいです。
0589デフォルトの名無しさん (ワッチョイ e780-gma9)
垢版 |
2018/10/13(土) 20:23:20.71ID:L3Dj2/gz0
標準入力から1行ずつひたすら読み込む
特定行以外をひたすら同じ内容を標準出力に出力する
特定行だけ変更内容を標準出力に出力する

できた
0590デフォルトの名無しさん (ワッチョイ e780-gma9)
垢版 |
2018/10/13(土) 20:36:09.45ID:L3Dj2/gz0
aho.sh
----
#!/bin/bash
aho < 01.txt > 01_tmp.txt
mv -f 01_tmp.txt 01.txt

引数でファイル名を指定するどうでもいいことがどうしてもしたい場合は
一旦、プログラムでテンポラリファイルに書きだして
プログラムで最後にmvする必要がある
0591デフォルトの名無しさん (ワッチョイ e780-gma9)
垢版 |
2018/10/13(土) 20:51:29.26ID:L3Dj2/gz0
https://ideone.com/CYlw3P
あとはテキトーにやりなさい
0597デフォルトの名無しさん (ワッチョイ bf3a-DKnb)
垢版 |
2018/10/13(土) 23:33:28.10ID:LwGfYqlW0
>>588
UNIXならmmap()、WindowsならCreateFileMapping()を使ってファイルの内容をメモリにマップするとか。
0598デフォルトの名無しさん (ワッチョイ e780-gma9)
垢版 |
2018/10/13(土) 23:34:05.47ID:L3Dj2/gz0
書いてあることをすべてCでやりたいなら
コレでいける
ぜんぶメモリにいれる必要はない

@ 入力ファイル(01.txt)をリードオンリーでオープン
A テンポラリファイル(出力ファイル)をmktemp()で取得
B Aで取得した出力ファイルをライトオンリーでオープン
C 1行ずつ読み込んで1行ずつ書きこみ(>>591
D 入力ファイルと出力ファイルをクローズ
E 入力ファイルをremove()で削除
F 出力ファイルをrename()で入力ファイルに移動

ものすごい大きいファイルが入力ファイルになった場合対応できない
0601588 (ワッチョイ 27cc-smg0)
垢版 |
2018/10/14(日) 02:24:40.11ID:bBeuqmk90
皆さん回答ありがとうございました。
やはり処理的にはすべて触らないとダメそうですね。
>>591さんの例はfopenとか必要ないのですか。
0602デフォルトの名無しさん (ワッチョイ dfd2-7vHE)
垢版 |
2018/10/14(日) 02:31:42.91ID:VGDv0f/D0
なんとなくsedで済む話な気がする
0603デフォルトの名無しさん (ブーイモ MM0b-ZPHe)
垢版 |
2018/10/14(日) 02:52:55.98ID:xvapfCASM
>>601
ファイル入出力ストリームなら必要
あの例は標準入出力を指定してるだけ

すべて触る必要があるかはデータ構造次第
更新するデータ域をブロック分割、
ブロックマップをメタ管理とかは
バイナリなら一般的な手法
テキストだとスペースパディングで
ブロックやエントリ管理できそうだが
そんなことやってる奴は見たことない
0607デフォルトの名無しさん (ワッチョイ 674f-gma9)
垢版 |
2018/10/14(日) 09:33:04.94ID:p/Li638e0
>>602
× なんとなく
○ ほぼ確実に

「Cで」「Cで」「Cで」、初心者はCしか出来ないからそれしか考えられない。(選択肢がない)
初心者あるあるだけども。
実際これ、Cで処理されてCバイナリを引き継がされても大迷惑だし。

>>588
マジな話、上司が居るのなら上司に聞けって。これ、Cでやったら大迷惑な話だし。
聞くのが迷惑だと思っているのなら、この件については聞かない(報告しない)ほうが迷惑だ。
上司が居なくてど初心者なら、この際にスクリプト言語を覚えろ。
0612デフォルトの名無しさん (ワイモマー MMff-ytAd)
垢版 |
2018/10/14(日) 12:19:08.18ID:vwPmx6lGM
特定行の書き換えですが
・bの値を反転させたい(0なら1、1なら0)
・b=の行は複数出現する可能性がある()
・複数出現した場合は一番最後に出現した行の値を反転の対象にしたい
・書き換え後はb=の行は1行だけにしたい
・書き換え後はできれば
a=...
b=...
c=...
な感じでソートしててほしい

これはC言語で出来ますか?
どうやったらいいでしょうか?
0613デフォルトの名無しさん (ワッチョイ 674f-gma9)
垢版 |
2018/10/14(日) 13:29:01.06ID:p/Li638e0
>>612
「出来る/出来ない」なら、そりゃC言語で「出来ない」って事ははほぼ全ての事例で無いよ。
どうやったらいいか、なら、その場合は俺ならExcel使うね。規模的に無理ならシェルスクリプトを使う。
何でもCでやればいいわけではない。

そのお題を実際にCでやる事なんて無いから、練習用なら意味無いし、
本番としてそれをCでやる気なら、間違ってるから止めとけ。
0615デフォルトの名無しさん (ワッチョイ e780-gma9)
垢版 |
2018/10/14(日) 14:42:07.27ID:Q3eQCyRU0
コードの書き方みたいなこんなもんを上司に聞けとか
よくわからんが、協力会社で入ってるリーダーかなんかか。。。
すげえな、そういった会社の文化をオレは知らないが

そもそもそんなとこが未教育なゴミつれてきたら大問題だからな
必死になるのも分かるわ

で、だれでもすぐ分かってるコマンド書いてドヤ顔して低学歴もいるしな
0616デフォルトの名無しさん (ワッチョイ e780-gma9)
垢版 |
2018/10/14(日) 14:43:20.19ID:Q3eQCyRU0
この程度ならCで書いても
普通にCで書く練習になる
0619デフォルトの名無しさん (ワッチョイ e780-gma9)
垢版 |
2018/10/14(日) 14:48:35.94ID:Q3eQCyRU0
sedとsort使えばいい
0620デフォルトの名無しさん (ワッチョイ 674f-gma9)
垢版 |
2018/10/14(日) 15:12:45.83ID:p/Li638e0
>>617
お前以外のみんな出来るっての。

お前がコードクレクレ君だからみんな適当にあしらってる。
お前が努力してる(=コードを試しに書いてみたが動かない)のなら、もう少しましな回答も出るだろうさ。
0622デフォルトの名無しさん (ワッチョイ 6735-4Hut)
垢版 |
2018/10/14(日) 17:39:13.57ID:+7qWkF0t0
こんな感じでどうかな
 ・空行はそのまま出力されてしまう
 ・代入文は1行に1文のみで X=n の形式
が前提だけど

awk -F= '{if($1=="b") b=$2; else print;} END{printf("b=%d\n", xor(b, 1))}' a | sort -u
0627デフォルトの名無しさん (ワッチョイ 7f80-WnU0)
垢版 |
2018/10/14(日) 18:31:52.87ID:hWarSIQ50
Ruby で作った

text = File.read 'data.txt'

ary = [ ]; index = [ ]

text.each_line.with_index do | line, idx | # 各行・添字
line.chomp! # 末尾の改行を削除する
ary.push line # 各行を配列に入れる

# 先頭文字列が、b= なら、添字を配列に入れる
index.push idx if line.start_with? 'b='
end

return if index.empty? # 空配列なら処理なし

first = true # 最初の1回だけ処理する
index.reverse!.each do | num | # 後ろから削除するために、反転する
if first # 最初の1回だけ
first = false

case ary[ num ][ 2 ] # 3文字目
when "0" then ary[ num ][ 2 ] = "1"
when "1" then ary[ num ][ 2 ] = "0"
else # 処理なし
end
else # 2回目以降は削除する
ary.delete_at num
end
end

puts ary
0629デフォルトの名無しさん (ワッチョイ 7f81-VhFj)
垢版 |
2018/10/15(月) 02:17:02.27ID:Obfj9PeS0
>>612の内容だけど、誰も聞かないのであえて聞くけど
b=以外は何も加工せずに複数あればそのまま出力で良いのか?
その場合、ソートは=の右側の数値順にするのか、文字コード順にするのかか
データによっては、a=、c=、d=の行が多数出力される中でb=の行だけ1行になる
ってことで良いのかな?
0631デフォルトの名無しさん (ワッチョイ e780-gma9)
垢版 |
2018/10/15(月) 23:43:48.26ID:KnJWry7m0
 @ [出力A]  a=とc=を抽出(使うコマンド:grep)
 A [出力B]  b=0の1〜末尾-1行を抽出 (使うコマンド:grep|head)
 B [出力C]  b=1の1〜末尾-1行を抽出 (使うコマンド:grep|head)
 C [出力D]  b=0の末尾行を抽出し置換 (使うコマンド:grep|tail|sed)
 D [出力E]  b=1の末尾行を抽出し置換 (使うコマンド:grep|tail|sed)
 E [出力F]  [出力B]、[出力E]、[出力C]、[出力D]コンカチネーションしユニークにする (使うコマンド:cat|uniq)
 F 出力結果 [出力A]と[出力F]をコンカチネーションしソート(使うコマンド:cat|sort)

とりあえずコレでいけるハズ
あとはがんばりなさい
0633デフォルトの名無しさん (ワッチョイ e780-gma9)
垢版 |
2018/10/15(月) 23:59:03.51ID:KnJWry7m0
だけでやるとはオレは一言もいってない
使うコマンドを限定した覚えはない
0634612 (ワイモマー MMff-ytAd)
垢版 |
2018/10/16(火) 00:22:11.79ID:NB8XYwuTM
ソートはa,b,c...順です
b=以外は重複を許可します(ソート後の出現順は考慮しなくてよい)
(処理例
入力データ
c=0
a=1
b=1
c=1
a=0
b=0
出力データ
a=1
a=0
b=1
c=0
c=1
0638デフォルトの名無しさん (ワッチョイ 7f81-VhFj)
垢版 |
2018/10/16(火) 01:01:42.59ID:gETK/lfa0
bが1行しかないとうまく行かないな
ちょっと手直し

sed -e ":l; N; /b=.*b=/{;s/\nb=[01]\n/\n/1;}; $p; b l" 01.txt | sed -e "/b=1/{;s/b=1/b=x0/;};/b=0/{;s/b=0/b=x1/;};/b=x/{;s/x//;}"

並び替えはsortでやってください
0643デフォルトの名無しさん (アウアウカー Sa7b-GU/K)
垢版 |
2018/10/16(火) 09:23:21.39ID:HrwRMilta
いーんじゃない?
0645デフォルトの名無しさん (アウアウカー Sa7b-GU/K)
垢版 |
2018/10/16(火) 13:03:31.45ID:0QUQFWONa
てか、Cのスレで質問者もCでどうやるか聞いてるのに誰もCで答えてないw

ま、Cで書く気が失せる問題ではあるが。
0647デフォルトの名無しさん (ワッチョイ 078a-oHS3)
垢版 |
2018/10/16(火) 13:38:03.74ID:dIjk/xku0
C言語でやるとしたら
b=で始まる行以外は適当な一時ファイルに出力し
b=で始まる行だけはメモリー上に格納しておく
b=行が出現する度に、あたらしい行データでメモリー上を更新する
EOFまで処理したら、一時ファイルとメモリー上のデータをマージする
その際にb=の値を所定の値に置換する
順番は後にソートする前提なので適当で構わない
ソートは外部コマンドでやらせて良いだろうね
0649デフォルトの名無しさん (アウアウカー Sa7b-GU/K)
垢版 |
2018/10/16(火) 17:35:52.31ID:HrwRMilta
>>648
おお。上の方過ぎて気づかなかった。
0653デフォルトの名無しさん (ワッチョイ e764-66c6)
垢版 |
2018/10/16(火) 23:06:58.82ID:HI3tJEA90
C99時代のhello worldプログラムを考えてみた。

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

static inline void
print_hello(void)
{
puts("Hello, C!");
}

int
main(void)
{
print_hello();

exit(EXIT_SUCCESS);
}

exit()関数を使ったり、main()関数の中に直に処理を書かないとか色々。
0654デフォルトの名無しさん (ワッチョイ bf9f-pYQO)
垢版 |
2018/10/16(火) 23:31:05.44ID:ZKPc2SIw0
なんだこれ?引数 void って初めて見たぞ。文法的にありなのかこれ?
0655デフォルトの名無しさん (ワッチョイ bf9f-pYQO)
垢版 |
2018/10/16(火) 23:35:18.29ID:ZKPc2SIw0
>>653
あれ?それ、コンパイルすると警告出ないか?main()が何も返してないって。
いや、exit()を理解してくれるコンパイラなら何も出ないかも知れないけどね。
0656デフォルトの名無しさん (ワッチョイ e764-66c6)
垢版 |
2018/10/16(火) 23:48:35.20ID:HI3tJEA90
>>655
c99 -O2 -Wall -Werror -Wextra hello.c -o hello
これで無警告だった。
c99はGNU/Linuxだとgcc -std=c99を実行してる。
icc -std=c99 -O2 -Wall -Werror -Wextra hello.c -o hello
でも成功。
GNUのコンパイラでもIntelのコンパイラでもちゃんと処理できるのでいいんじゃないかなぁ。
0657デフォルトの名無しさん (ワッチョイ bf9f-pYQO)
垢版 |
2018/10/17(水) 01:16:05.15ID:GVzdQn3+0
そうだったか。
0659デフォルトの名無しさん (ワッチョイ c7e3-Zu1O)
垢版 |
2018/10/17(水) 01:48:50.18ID:aAn3UH6A0
c99から(とc++も)main()は特別扱いで省略時はreturn 0;と扱われる
とググったらでてきた

なんでmain()だけ?どうせなら関数全てそうしちゃえばいいのに、と思わなくもない
0660デフォルトの名無しさん (ワッチョイ bf9f-pYQO)
垢版 |
2018/10/17(水) 02:29:49.55ID:GVzdQn3+0
なんと。そうだったのか。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況