C言語なら俺に聞け! Part 110

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2005/07/16(土) 13:10:20
63 :csv ◆d4Q1dM/8Ps :04/04/11 15:21
作ってみた(age)
/* CSVデータ(数値)分割 */
/* ・maxItem迄、item[]に格納 */
/* ・分割できた個数を返す / -1は分割NG */
int divCSV(const char *src, int *item, int maxItem)
{
char *p;
int n,itemNum=0;
if(src==NULL || item==NULL || maxItem<1) return -1;
do{
if((p=strchr(src,','))) *p='\0';
n=sscanf(src, "%d", (item+itemNum)); if(p) *p=',';
if(n<1) return itemNum;
++itemNum;
src=p+1;
}while(p && itemNum<maxItem);
return itemNum;
}


こんなの見つけたけどsrc書き換えちゃってるねw
953デフォルトの名無しさん:2005/07/16(土) 13:12:04
長い処理の待ち時間の間にコマンドプロンプトの画面上に
\→-→/→| みたいにくるくる回るのを表示したり、プログレス
バーみたいなのを描画したりしてるのはどうやってるのでしょうか。
stdoutに書き出すのと違って、前に出力したやつの上に重ねて(?)
出力してるような感じなんですが、うまくいえなくてスイマセン
954>>928:2005/07/16(土) 13:31:53
こんな質問しといて遅レス真にスマソ

>>929

やっぱだめですか
一つ一つ開放していくしかないのですね
ありがとうございました。
955デフォルトの名無しさん:2005/07/16(土) 13:50:56
>>953
windowsXPでコマンドプロンプトの場合は
先頭行にいく\r使えばよろし。
\nは改行だからね。
956デフォルトの名無しさん:2005/07/16(土) 14:01:35
>>955
>先頭行にいく\r使えばよろし。
できれば日本語で説明してください。
957デフォルトの名無しさん:2005/07/16(土) 14:52:57
配列の配列を動的に確保するのはどうすればいいのでしょうか?
いろいろ調べたのですがわからなくて、、1次元配列の確保ならわかるのですが。
958デフォルトの名無しさん:2005/07/16(土) 15:04:24
>>957
int * * alloArray2(int size1, int size2)
{
int * * tmp = malloc(sizeof(int *) * size1);
for (int i = 0; i < size1; ++i) {
tmp[i] = malloc(sizeof(int) * size2);
return tmp;
}

void freeArray2(int * * arr2, int size1)
{
for (int i = 0; i < size1; ++i) {
free(arr2[i]);
}
free(arr2);
}
959デフォルトの名無しさん:2005/07/16(土) 15:28:28
>>957-958
こうすると、組み込みの配列みたいに要素が連続し、
freeも戻り値のポインタに対してだけ実行すればいいのでやや楽。
ただし要素数があまりにも多ければ無理かもしれないが。

void **SquareAlloc(size_t size, size_t x, size_t y)
{
    size_t offset = sizeof (void*) * x;
    void **pp = malloc(offset + size * x * y);
    if (pp)
    {
        void **ppIndex = pp;
        size_t i;
        for (i = 0; i < x; i++)
            ppIndex[i] = (char *)pp + offset + size * y * i;
    }
    return pp;
}
960デフォルトの名無しさん:2005/07/16(土) 15:47:52
malloc(sizeof(int *) * size1); とか malloc(sizeof(int) * size2); がアホ
961デフォルトの名無しさん:2005/07/16(土) 16:07:34
第1引数で読み込んだテキストファイルの「半角スペース」「全角スペース」「タブ」「改行」を取り除いて
第2引数で指定したファイルに保存するプログラムなんですが
最後にどうしても変な一文字が入ってしまいます。
whileがいけないと思い、do-whileにしたのですがだめでした。
どうやれば消えるでしょうか?どなたか教えてください。

#include<stdio.h>
int main(int argc, char *argv[])
{
int txt;
FILE *before, *after;
before = fopen(argv[1], "r");
after = fopen(argv[2], "w");
do
{
txt = fgetc(before);
if(txt == ' ' || txt == ' ' || txt == '' || txt == '\n') continue;
fputc(txt, after);
fputc(txt, stdout);
}
while(!feof(before));
fclose(before);
fclose(after);
return 0;
}
962デフォルトの名無しさん:2005/07/16(土) 16:24:12
>>961
ところで全角スペースは1バイト文字じゃないからそれでは判定できない。
963958:2005/07/16(土) 16:29:25
>>961
ストリームからの入力は、fgetc()がEOFを返すまでループするのが常道。
feof()を調べるまでもない。

>>960
アホでない例を所望します。
964961:2005/07/16(土) 16:34:50
>>962
早速の返信ありがとうございます。
全角は判定しませんでした。

全角なしでお願いします
965961:2005/07/16(土) 16:43:46
>>963
feof()を取り除いて作り直したらできました。

ありがとうございました。
966デフォルトの名無しさん:2005/07/16(土) 18:14:06
>>959
それdoubleの配列でも大丈夫か?整列しない気がするんだが
967デフォルトの名無しさん:2005/07/16(土) 18:15:50
>>952
""での引用やカラム中の改行にも対応してないのに無駄に長く汚い
ま、糞ソースだな
968デフォルトの名無しさん:2005/07/16(土) 18:25:41
class Class{
public:
  void method(int (*array)[10] ){}
}



class Class{
public:
  void method(int ???);
}

void Class::method(int (*array)[10]){}

のように書き換えたいのですが???部分はどのように書いたらよいのでしょうか?
969デフォルトの名無しさん:2005/07/16(土) 18:28:52
>>968
好きなように書いてください。???部分をどのように書いてもコンパイルできませんから。
970デフォルトの名無しさん:2005/07/16(土) 18:31:40
>>969
セミコロンを2つほど書き忘れたのは気がつきましたが、
他にもまずいところがありますか?
971デフォルトの名無しさん:2005/07/16(土) 18:33:31
>>970
>1
972デフォルトの名無しさん:2005/07/16(土) 18:45:11
   〃∩ ∧_∧
   ⊂⌒(  ・ω・)  はいはいわろすわろす
     `ヽ_っ⌒/⌒c     
        ⌒ ⌒

(´〜`;)ああ、イヤダイヤダ。
夏厨が湧き出しちゃったよ。
これから9月まで2ch全体が
つまらなくなるだよな。さっさと
夏終われ。ガキは学校でクセエ
汁垂らして部活でもやってろ。
あーあー、ウザイウザイw
973デフォルトの名無しさん:2005/07/16(土) 19:15:10
2chぐらいしか楽しみのないニートって大変だな……
ガキ相手に「ボクの遊び場を荒らすな〜!」ってか?
974デフォルトの名無しさん:2005/07/16(土) 19:18:19
void method(int ???);
void method(int (*array)[10]){}
と書けば答えてもらえたんですかね?

>>969
>>971
的確なアドバイスをありがとうございました。
>>972
笑いを提供できて幸いです。
975デフォルトの名無しさん:2005/07/16(土) 19:28:45
>まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう

C++とCは違う
976ikaikaikajika:2005/07/17(日) 00:52:48
以下のプログラムはお茶運びロボットのプログラムなのですが、これを
改良してほしいんです。 これは お茶を置いたら タッチセンサーが感知して
ロボット発進、そしてお茶を持ってるときに 障害物を 光センサーが感知
すると 止まり、お茶を取られると、180度回転して、帰るのですが、帰る途中に
障害物を光センサーが感知すると 避けて行くように してほしいんですが?
どうでしょうか?



977デフォルトの名無しさん:2005/07/17(日) 00:56:02
int main()
{
return 0;
}
978デフォルトの名無しさん:2005/07/17(日) 01:59:36
>>955
ありがとうございます。なんとかできました。
979デフォルトの名無しさん:2005/07/17(日) 04:35:36
>>976 >>977
久々にワロタ
980デフォルトの名無しさん:2005/07/17(日) 17:08:11
カンマで区切られたデータを構造体に格納するプログラムってどうすればいいんでしょうか?
abc,def,ghi,jikl
mno,ofi,jik,ji,
.
.
以下延々という感じなのですが

リダイレクションを使って標準入力としていいようなのですが、格納の仕方がわかりません。
981デフォルトの名無しさん:2005/07/17(日) 17:15:49
scanf
982デフォルトの名無しさん:2005/07/17(日) 17:56:56
>>980
fgets() + sscanf() w/ "%[^,]"
983980:2005/07/17(日) 18:03:42
>>982
ありがとうございます。あのW/ってどういう意味でしょうか?
984デフォルトの名無しさん:2005/07/17(日) 18:47:31
>>983
with
985デフォルトの名無しさん:2005/07/17(日) 19:01:52
T
986デフォルトの名無しさん:2005/07/17(日) 20:19:00
>>980
>982
関数fgetsと、"%[^,]"を伴った関数sscanf。
987デフォルトの名無しさん:2005/07/17(日) 23:10:36
配列の初期化で0クリアする場合に
a[5] = { } とするのはベテランの人から見てどうなんでしょうか。

ネットで検索したところ a[5] = { 0 }
988987:2005/07/17(日) 23:12:48
ネットで検索したところ a[5] = { 0 } と書くのはよく見かけたんですが
専門学校の先生には「見た目がよくない」と言われました。
普通に使う書き方なんでしょうか。
989デフォルトの名無しさん:2005/07/17(日) 23:14:06
memset
990デフォルトの名無しさん:2005/07/17(日) 23:21:03
先生に訊き返せよ
金払ってんだろ?
991デフォルトの名無しさん:2005/07/17(日) 23:25:08
>>987
a[5] = { }; は規格で認められているのか?
a[5] = {0}; で通してきたぞ俺は。

>>989
memse は初期化と言いません
992デフォルトの名無しさん:2005/07/17(日) 23:28:30
俺ならaがchar/wchar_t配列ならchar a[5] = ""; wchar_t a[5] = L"";にする。
ほかはしかたないから{0}にするけど。
993デフォルトの名無しさん:2005/07/17(日) 23:28:56
memse t⊂(`Д´)
994987:2005/07/17(日) 23:33:52
今慌てて試したら = { } は動きませんでした、勘違いしてたみたいです。
= {0} のほうは普通に使われるみたいですね。
将来人に見せることになると考えると「見た目が悪い」という言葉が気になったので。
995デフォルトの名無しさん:2005/07/17(日) 23:42:55
見た目が悪いと言った人間に聞くのが一番かと
996デフォルトの名無しさん:2005/07/17(日) 23:47:10
>>987
適所適材。
「見た目が良い初期化」なんか見たことない。
その教員は鏡でも見てたんだろう。
997デフォルトの名無しさん:2005/07/17(日) 23:48:45
1000ならC滅亡
998デフォルトの名無しさん:2005/07/17(日) 23:49:18
>>994
君は先生に質問し、どのような方法であれば見た目が良い方法なのか
ここに報告する義務がある
このスレが終わるまでに報告しなければならない
これは命令だ
999デフォルトの名無しさん:2005/07/17(日) 23:59:39
gccは={}通るぞ
1000デフォルトの名無しさん:2005/07/18(月) 00:01:45
gcc拡張かよ
1000get
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。