トップページ⇒tech
17コメント9KB

C言語について

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 NGNG
今、C言語の本を読んで3日目なんですが
C++はC言語を理解してはじめて使えるようになると聞きました。
本当でしょうか。今の自分の状態はVC++のコンソールアプリケーションで
画面に文字を表示する程度のレヴェルです
ポインタもわかりました 構造体も
もうこれだけ知ってればVC++にいっても大丈夫ですよね
あと、なんでホゲホゲがよくプログラムの本で使われるのですか
0002名無しさんi486 NGNG
文章の意味がわかりません

国語を勉強しましょう
0003>1 NGNG
ここ見ていませんか?
http://piza.2ch.net/test/read.cgi?bbs=tech&key=970400968

単独質問スレは嫌われますよ。
0004名無しさん@お腹いっぱい。 NGNG
「レヴェル」
0005名無しさん@お腹いっぱい。 NGNG
れべ〜る
0006審査員 NGNG
課題です。ファイルからテキストデータを読み込み、
単語の数を出力し、次にその単語を逆から並べて出力してください。

入出力、文字列操作、フラグ、メモリの動的割り当て、
その他もろもろの基本を使って解きましょう。
これができれば基本は大丈夫です。

例)
aaa bbb ccc d e f
というデータの場合、単語数=6、
出力=f e d ccc bbb aaa

This is a pen
というデータの場合、単語数=4
出力=pen a is This

答えは一週間後に発表します。がんばってね。
0007名無しさん@お腹いっぱい。 NGNG
がんばれ
0008名無しさん@お腹いっぱい。 NGNG
>6
これが出来たら次の問題も出してくれる?
0009!1出来た NGNG
出来ました!
これで卒業ですか?
某スレッドと同じ人物ですのでコードが似ています。

ThisCommand < fileとして使ってください。
データ構造はリンクドリストを使ってます。
それと始めに確保した256バイトじゃ足りないときにreallocする
んですがこれでbufのアドレスが変わるとpがやばくなるので
bufとの差をとってあとで+しています。
間違いなど指摘してください。
============================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _word_linked_list
{
struct _word_linked_list *next;
struct _word_linked_list *prev;

char *s;
} word_linked_list;

typedef void ( *wll_loop_func )( word_linked_list *p );

word_linked_list wll;
word_linked_list *wll_cur = NULL;

void wll_init( void );
void wll_uninit( void );
int wll_size( void );
void wll_add( const char *s );
void wll_rloop( wll_loop_func f );

void
put_rall( word_linked_list *p )
{
printf( "%s\n"@` p->s );
}
0010!1出来た NGNG


int
main()
{
wll_init();

{
enum { BUFFER_SIZE = 256 };

int c;
int size = BUFFER_SIZE;
char *buf = malloc( sizeof( char ) * size );
char *p = buf;

if ( buf == NULL )
{
wll_uninit();
fprintf( stderr@` "Cannot malloc.(size=%d)\n"@` size );
exit( 1 );
}

while ( ( c = fgetc( stdin ) ) != EOF )
{
if ( c == ' ' )
{
*p = '\0';
wll_add( buf );

p = buf;
}
else
{
if ( p >= ( buf + size ) )
{
char *tmp = NULL;
size_t diff = p - buf;

size += BUFFER_SIZE;

tmp = realloc( buf@` sizeof( char ) * size );

if ( tmp == NULL )
{
free( buf );
wll_uninit();
fprintf( stderr@` "Cannot realloc.(size = %d)\n"@` size );
exit( 1 );
}

buf = tmp;
p = buf + diff;
}

*p++ = c;
}
}

*p = '\0';
wll_add( buf );
}

printf( "word size: %d\n"@` wll_size() );
wll_rloop( put_rall );

wll_uninit();

return 0;
}


void
wll_init( void )
{
wll.next = wll.prev = &ampwll;
wll_cur = &ampwll;
}

void
wll_uninit( void )
{
word_linked_list *p = wll.next;
word_linked_list *next = NULL;

while ( p != &ampwll )
{
next = p->next;

free( p->s );
free( p );
p = next;
}
}
0011!1出来た NGNG


int
wll_size( void )
{
int size = 0;
word_linked_list *p = wll.next;

while ( p != &ampwll )
{
++size;
p = p->next;
}

return size;
}

void
wll_add( const char *s )
{
word_linked_list *o =
(word_linked_list *)malloc( sizeof( word_linked_list ) );

o->s = strdup( s );
o->next = wll_cur->next;
o->prev = wll_cur;

wll_cur->next->prev = o;
wll_cur->next = o;

wll_cur = o;
}

void
wll_rloop( wll_loop_func f )
{
word_linked_list *p = wll.prev;

while ( p != &ampwll )
{
f( p );
p = p->prev;
}
}
0012!1出来た NGNG
記号とかがかわってるのでここにアップ。91番でよろしく。
http://zurubon.virtualave.net/source.cgi
0013C++ NGNG
こんなものでどうでしょう?
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>

using namespace std;

typedef vector<string> vstr;

int main( int argc @` char **argv )
{
string Buf;
vstr vs;
while( !cin.eof() ) {
if( cin.peek() == ' ' ) {
vs.push_back(Buf);
cin.get();Buf.clear();
}
else Buf += cin.get();
}
cout << vs.size () << " words." << endl;
sort( vs.begin() @` vs.end() );
vstr::reverse_iterator ist = vs.rbegin();
while( ist != vs.rend() )
cout << *(ist++) << ' ';
cout << endl;
return 0;
}

0014C NGNG
ファイルはリダイレクトして食わしてやってください
大きいもの食わすとスタックが逝くので気をつけてね

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define EXPSIZE 8192
#define SEPARATER "\t\n\v\f\r "

char *readstdin(void)
{
  int c;
  size_t size=EXPSIZE;
  char *buf@`*ptr;
  if (NULL==(ptr=buf=malloc(size))) exit(errno);
  while (EOF!=(c=fgetc(stdin))) {
    if(buf+size==ptr)
      if(NULL==(buf=realloc(buf@`size+=EXPSIZE))) exit(errno);
      else ptr=buf+size-EXPSIZE;
    *ptr++=c?c:' ';
  }
  *ptr=0;
  return buf;
}

void count(int n@`char* ptr)
{
  if (ptr==NULL) printf("Count=%d\nReverse="@`n);
  else {
    count(n+1@`strtok(NULL@`SEPARATER));
    printf("%s "@`ptr);
  }
}

int main(int argc@` char* argv[])
{
  count(0@`strtok(readstdin()@`SEPARATER));
  printf("\n");
  return 0;
}

001514 NGNG
あらら、ちょっとはみ出ました。
30行で入るくらい小さいのはできないですかね‥
001614 NGNG
ああ、いかん!確保したメモリを開放してませんね。
ま、こんくらいならふつう終わるときに開放してくれるからいいじゃん‥
‥ってわけにはいかないですかね。
0017名無しさん@お腹いっぱい。 NGNG
>>9-12
(1)ファイルの先頭にスペース2つ。
(2)ファイルの末尾にスペース2つ。
(3)ファイルの先頭にスペース1つ、および末尾に1つ。

このケースにおいて不具合が見られます。
この原因を考えて見てください。

>>13
簡潔なコードですね。
C++(特にSTL)はホント便利です。
■ このスレッドは過去ログ倉庫に格納されています