C言語について
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
NGNGC++はC言語を理解してはじめて使えるようになると聞きました。
本当でしょうか。今の自分の状態はVC++のコンソールアプリケーションで
画面に文字を表示する程度のレヴェルです
ポインタもわかりました 構造体も
もうこれだけ知ってればVC++にいっても大丈夫ですよね
あと、なんでホゲホゲがよくプログラムの本で使われるのですか
0002名無しさんi486
NGNG国語を勉強しましょう
0003>1
NGNGhttp://piza.2ch.net/test/read.cgi?bbs=tech&key=970400968
単独質問スレは嫌われますよ。
0004名無しさん@お腹いっぱい。
NGNG0005名無しさん@お腹いっぱい。
NGNG0006審査員
NGNG単語の数を出力し、次にその単語を逆から並べて出力してください。
入出力、文字列操作、フラグ、メモリの動的割り当て、
その他もろもろの基本を使って解きましょう。
これができれば基本は大丈夫です。
例)
aaa bbb ccc d e f
というデータの場合、単語数=6、
出力=f e d ccc bbb aaa
This is a pen
というデータの場合、単語数=4
出力=pen a is This
答えは一週間後に発表します。がんばってね。
0007名無しさん@お腹いっぱい。
NGNG0008名無しさん@お腹いっぱい。
NGNGこれが出来たら次の問題も出してくれる?
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出来た
NGNGint
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出来た
NGNGint
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出来た
NGNGhttp://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
NGNG30行で入るくらい小さいのはできないですかね‥
001614
NGNGま、こんくらいならふつう終わるときに開放してくれるからいいじゃん‥
‥ってわけにはいかないですかね。
0017名無しさん@お腹いっぱい。
NGNG(1)ファイルの先頭にスペース2つ。
(2)ファイルの末尾にスペース2つ。
(3)ファイルの先頭にスペース1つ、および末尾に1つ。
このケースにおいて不具合が見られます。
この原因を考えて見てください。
>>13
簡潔なコードですね。
C++(特にSTL)はホント便利です。
■ このスレッドは過去ログ倉庫に格納されています