Powered by SmartDoc

ソフトウェア概論A/B (2010/10/22)
Ver. 1.0

2010年10月22日
栗野 俊一
kurino@math.cst.nihon-u.ac.jp
http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino/2010/soft/soft.html
ソフトウェア概論 A/B2010年10月22日 の資料

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

本日の概要

9.文字列の基本( Text p.207 - 223 )

-->

講義で利用するサンプルプログラム

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * C 言語の様々なリテラル
 */

#include <stdio.h>

/*
 * main
 */

int main ( void ) {

  printf ( "「123」:整数型の %d \n", 123 );
  printf ( "「123.0」: 浮動小数点型の %f \n", 123.0 );
  printf ( "「0.01」: 浮動小数点型の %f \n", 0.01 );
  printf ( "「1e-2」: 浮動小数点型の %f \n", 1e-2 );
  printf ( "「1」: 整数型の %d \n", 1 );
  printf ( "「'1'」: 文字型の %c \n", '1' );
  printf ( "「\"1\"」: 文字型の %s \n", "1" );

  return 0;
}
sample-001.c の実行結果
C:\usr\c\> sample-001
「123」:整数型の 123 
「123.0」: 浮動小数点型の 123.000000 
「0.01」: 浮動小数点型の 0.010000 
「1e-2」: 浮動小数点型の 0.010000 
「1」: 整数型の 1 
「'1'」: 文字型の 1 
「"1"」: 文字型の 1 
C:\usr\c\> 

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * C 言語の様々な文字リテラル
 */

#include <stdio.h>

/*
 * main
 */

int main ( void ) {

  printf ( "例 1.「ABC」: %s\n", "ABC" );
  printf ( "例 2.「A\\nC」: %s\n", "A\nC" );
  printf ( "例 3.「A\\\"C」: %s\n", "A\"C" );
  printf ( "例 4.「A\\\\C」: %s\n", "A\\C" );
  printf ( "例 5.「A\\0C」: %s\n", "A\0C" );

  return 0;
}
sample-002.c の実行結果
C:\usr\c\> sample-002
例 1.「ABC」: ABC
例 2.「A\nC」: A
C
例 3.「A\"C」: A"C
例 4.「A\\C」: A\C
例 5.「A\0C」: A
C:\usr\c\> 

sample-003

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * C 言語の様々な文字リテラルの中身
 */

#include <stdio.h>
#include <string.h>

/*
 * main
 */

int main ( void ) {

  printf ( "例「\"ABC\"」: \"%s\"の大きさ(sizeof(\"ABC\")) = %d\n\n", "ABC", sizeof ( "ABC" ) );

  printf ( "番目\tコード\t文字\n" );
  printf ( "%d\t%d\t「%c」\n", 0, "ABC"[0], "ABC"[0] );
  printf ( "%d\t%d\t「%c」\n", 1, "ABC"[1], "ABC"[1] );
  printf ( "%d\t%d\t「%c」\n", 2, "ABC"[2], "ABC"[2] );
  printf ( "%d\t%d\t「%c」\n", 3, "ABC"[3], "ABC"[3] );

  printf ( "文字列(\"ABC\") の長さ (strlen (\"ABC\") ) = %d\n", strlen ( "ABC" ) );

  return 0;
}
sample-003.c の実行結果
C:\usr\c\> sample-003
例「"ABC"」: "ABC"の大きさ(sizeof("ABC")) = 4

番目	コード	文字
0	65	「A」
1	66	「B」
2	67	「C」
3	0	「」
文字列("ABC") の長さ (strlen ("ABC") ) = 3
C:\usr\c\> 

sample-004

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * C 言語の様々な文字リテラルの中身
 */

#include <stdio.h>
#include <string.h>

/*
 * main
 */

int main ( void ) {

  printf ( "例「\"A\\0C\"」: \"%s\"の大きさ(sizeof(\"A\\0C\")) = %d\n\n", "A\0C", sizeof ( "A\0C" ) );

  printf ( "番目\tコード\t文字\n" );
  printf ( "%d\t%d\t「%c」\n", 0, "A\0C"[0], "A\0C"[0] );
  printf ( "%d\t%d\t「%c」\n", 1, "A\0C"[1], "A\0C"[1] );
  printf ( "%d\t%d\t「%c」\n", 2, "A\0C"[2], "A\0C"[2] );
  printf ( "%d\t%d\t「%c」\n", 3, "A\0C"[3], "A\0C"[3] );

  printf ( "文字列(\"A\\0C\") の長さ (strlen (\"A\\0C\") ) = %d\n", strlen ( "A\0C" ) );

  return 0;
}
sample-004.c の実行結果
C:\usr\c\> sample-004
例「"A\0C"」: "A"の大きさ(sizeof("A\0C")) = 4

番目	コード	文字
0	65	「A」
1	0	「」
2	67	「C」
3	0	「」
文字列("A\0C") の長さ (strlen ("A\0C") ) = 1
C:\usr\c\> 

sample-005

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 文字配列と文字列 (List 9-2 : p.210)
 */

#include <stdio.h>
#include <string.h>

/*
 * defines
 */

#define	EOS		'\0'

/*
 * main
 */

int main ( void ) {

  char str[100];	/* 文字列を納める配列 : 文字列の長さより、少くても 1 大きいサイズにする */

  str[0] = 'A';	/* 1 文字目に 'A' */
  str[1] = 'B';	/* 2 文字目に 'B' */
  str[2] = 'C';	/* 3 文字目に 'C' */
  str[3] = EOS;	/* 4 文字目に EOS ('\0' : NUL 文字) / 文字列の最後に必要 */

  printf ( "文字配列 str が表現している文字列は「%s」です。\n", str );

  printf ( "文字配列のサイズは %d ですが、文字列の長さは %d になります。\n", sizeof(str), strlen(str) );

  return 0;
}
sample-005.c の実行結果
C:\usr\c\> sample-005
文字配列 str が表現している文字列は「ABC」です。
文字配列のサイズは 100 ですが、文字列の長さは 3 になります。
C:\usr\c\> 

sample-006

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * 文字配列の初期化と文字列 (List 9-3 : p.211)
 */

#include <stdio.h>
#include <string.h>

/*
 * main
 */

int main ( void ) {

  char str[100] = "ABC";	/* 文字列を納める配列 : 文字列の長さより、少くても 1 大きいサイズにする */

  printf ( "文字配列 str が表現している文字列は「%s」です。\n", str );
  printf ( "文字配列のサイズは %d ですが、文字列の長さは %d になります。\n", sizeof(str), strlen(str) );

  return 0;
}
sample-006.c の実行結果
C:\usr\c\> sample-006
文字配列 str が表現している文字列は「ABC」です。
文字配列のサイズは 100 ですが、文字列の長さは 3 になります。
C:\usr\c\> 

sample-007

Download : sample-007.c ( SJIS 版 )

sample-007.c
/*
 * 文字配列の初期化と文字列 (List 9-3 : p.211)
 */

#include <stdio.h>
#include <string.h>

/*
 * main
 */

int main ( void ) {

  char str[100] = { 'A', 'B', 'C', '\0' };	/* 最初の 4 つを初期化 */

  printf ( "文字配列 str が表現している文字列は「%s」です。\n", str );
  printf ( "文字配列のサイズは %d ですが、文字列の長さは %d になります。\n", sizeof(str), strlen(str) );

  return 0;
}
sample-007.c の実行結果
C:\usr\c\> sample-007
文字配列 str が表現している文字列は「ABC」です。
文字配列のサイズは 100 ですが、文字列の長さは 3 になります。
C:\usr\c\> 

sample-008

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 文字配列の初期化と文字列 (List 9-3 : p.211)
 */

#include <stdio.h>
#include <string.h>

/*
 * main
 */

int main ( void ) {

  char str[] = "ABC";	/* 文字配列のサイズを省略すると、自動的に文字列の長さ + 1 のサイズになる */

  printf ( "文字配列 str が表現している文字列は「%s」です。\n", str );
  printf ( "文字配列のサイズは %d ですが、文字列の長さは %d になります。\n", sizeof(str), strlen(str) );

  return 0;
}
sample-008.c の実行結果
C:\usr\c\> sample-008
文字配列 str が表現している文字列は「ABC」です。
文字配列のサイズは 4 ですが、文字列の長さは 3 になります。
C:\usr\c\> 

sample-009

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * 文字配列の初期化と文字列 (演習 9-1 : p.211)
 */

#include <stdio.h>
#include <string.h>

/*
 * main
 */

int main ( void ) {
  char str[] = "ABC\0XYZ";
  int i;

  printf ( "文字配列 str が表現している文字列は「%s」です。\n", str );
  printf ( "文字配列のサイズは %d ですが、文字列の長さは %d になります。\n", sizeof(str), strlen(str) );

  printf ( "番目\tコード\t文字\n" );
  for ( i = 0; i < sizeof( str ); i++ ) {
	printf ( "%d\t%d\t「%c」\n", i, str[i], str[i] );
  }

  return 0;
}
sample-009.c の実行結果
C:\usr\c\> sample-009
文字配列 str が表現している文字列は「ABC」です。
文字配列のサイズは 8 ですが、文字列の長さは 3 になります。
番目	コード	文字
0	65	「A」
1	66	「B」
2	67	「C」
3	0	「」
4	88	「X」
5	89	「Y」
6	90	「Z」
7	0	「」
C:\usr\c\> 

sample-010

Download : sample-010.c ( SJIS 版 )

sample-010.c
/*
 * 空文字列
 */

#include <stdio.h>
#include <string.h>

/*
 * main
 */

int main ( void ) {
  char str[] = "";	/* 空文字列 */
  int i;

  printf ( "文字配列 str が表現している文字列は「%s」です。\n", str );
  printf ( "文字配列のサイズは %d ですが、文字列の長さは %d になります。\n", sizeof(str), strlen(str) );

  printf ( "番目\tコード\t文字\n" );
  for ( i = 0; i < sizeof( str ); i++ ) {
	printf ( "%d\t%d\t「%c」\n", i, str[i], str[i] );
  }

  return 0;
}
sample-010.c の実行結果
C:\usr\c\> sample-010
文字配列 str が表現している文字列は「」です。
文字配列のサイズは 1 ですが、文字列の長さは 0 になります。
番目	コード	文字
0	0	「」
C:\usr\c\> 

sample-011

Download : sample-011.c ( SJIS 版 )

sample-011.c
/*
 * NUL 文字の役割
 */

#include <stdio.h>

/*
 * defines
 */

#define	EOS		'\0'

/*
 * main
 */

int main ( void ) {
  char str[] = "ABCDEFG";
  int i;

  printf ( "文字配列 str が表現している文字列は「%s」です。\n", str );

  str[3] = EOS;	/* 1 の場所の要素に EOS('\0') にすると、文字列としては "ABC" になる */

  printf ( "文字配列 str が表現している文字列は「%s」です。\n", str );

  str[3] = 'd';	/* 1 の場所の要素に 'd' にすると、文字列としては "ABCdEFG" になる */

  printf ( "文字配列 str が表現している文字列は「%s」です。\n", str );

  str[0] = EOS;	/* 0 の場所の要素に EOS('\0') にすると、文字列としては "" (空文字)になる */

  printf ( "文字配列 str が表現している文字列は「%s」です。\n", str );

  return 0;
}
sample-011.c の実行結果
C:\usr\c\> sample-011
文字配列 str が表現している文字列は「ABCDEFG」です。
文字配列 str が表現している文字列は「ABC」です。
文字配列 str が表現している文字列は「ABCdEFG」です。
文字配列 str が表現している文字列は「」です。
C:\usr\c\> 

sample-012

Download : sample-012.c ( SJIS 版 )

sample-012.c
/*
 * 文字列の入力 ( List 9-4 : p.212 )
 */

#include <stdio.h>

/*
 * main
 */

#define	STR_SIZE	1024

int main ( void ) {
  char str[STR_SIZE];

  printf ( "御名前は : " );
  scanf ( "%s", str );		/* & が不要である事に注意*/

  printf ( "こんにちは %s さん\n", str );

  return 0;
}
入力例
栗野俊一
sample-012.c の実行結果
C:\usr\c\> sample-012
御名前は : 栗野俊一
こんにちは 栗野俊一 さん
C:\usr\c\> 

sample-013

Download : sample-013.c ( SJIS 版 )

sample-013.c
/*
 * 文字列の出力 ( List 9-5 : p.213 )
 */

#include <stdio.h>

/*
 * main
 */

int main ( void ) {
  char str[] = "12345";

  printf ( "%s\n", str );	/* そのまま */
  printf ( "%3s\n", str );	/* 最低 3 文字 */
  printf ( "%.3s\n", str );	/* 3 文字まで */
  printf ( "%8s\n", str );	/* 最低 8 文字、足りない部分は空白を前に詰る(右寄せ) */
  printf ( "%-8s\n", str );	/* 最低 8 文字、足りない部分は空白を後に詰る(左寄せ) */

  return 0;
}
sample-013.c の実行結果
C:\usr\c\> sample-013
12345
12345
123
   12345
12345   
C:\usr\c\> 

sample-014

Download : sample-014.c ( SJIS 版 )

sample-014.c
/*
 * 文字列の配列 (List 9-6 : p.214)
 */

#include <stdio.h>

/*
 * main
 */

#define	EOS		'\0'
#define	MIN_SIZE	6

int main ( void ) {
  char str_ary[][MIN_SIZE] = { "Turbo", "NA", "DOHC", "" };
  int i;

  for ( i = 0; str_ary[i][0] != EOS; i++ ) {
	printf ( "str_ary[%d]=\"%s\"\n", i, str_ary[i] );
  }

  return 0;
}
sample-014.c の実行結果
C:\usr\c\> sample-014
str_ary[0]="Turbo"
str_ary[1]="NA"
str_ary[2]="DOHC"
C:\usr\c\> 

sample-015

Download : sample-015.c ( SJIS 版 )

sample-015.c
/*
 * 文字列の配列への読み込み (List 9-7 : p.215)
 */

#include <stdio.h>

/*
 * main
 */

#define	MIN_SIZE	1024
#define	ARY_SIZE	3

int main ( void ) {
  char str_ary[ARY_SIZE][MIN_SIZE];
  int i;

  for ( i = 0; i < ARY_SIZE; i++ ) {
	printf ( "str_ary[%d]:", i );
	scanf ( "%s", str_ary[i] );
  }

  for ( i = 0; i < ARY_SIZE; i++ ) {
	printf ( "str_ary[%d]=\"%s\"\n", i, str_ary[i] );
  }

  return 0;
}
入力例
S500L
A8
SLK
sample-015.c の実行結果
C:\usr\c\> sample-015
str_ary[0]:S500L
str_ary[1]:A8
str_ary[2]:SLK
str_ary[0]="S500L"
str_ary[1]="A8"
str_ary[2]="SLK"
C:\usr\c\> 

sample-016

Download : sample-016.c ( SJIS 版 )

sample-016.c
/*
 * 文字列の配列への読み込み (scanf/gets は危険)
 */

#include <stdio.h>

/*
 * main
 */

#define	MIN_SIZE	10	/* 態と小くした */
#define	ARY_SIZE	3

int main ( void ) {
  char str_ary[ARY_SIZE][MIN_SIZE];
  int i;

  for ( i = 0; i < ARY_SIZE; i++ ) {
	printf ( "str_ary[%d]:", i );
	scanf ( "%s", str_ary[i] );
  }

  for ( i = 0; i < ARY_SIZE; i++ ) {
	printf ( "str_ary[%d]=\"%s\"\n", i, str_ary[i] );
  }

  return 0;
}
入力例
abcdef
uvwxyz123456789
ghijke
sample-016.c の実行結果
C:\usr\c\> sample-016
str_ary[0]:abcdef
str_ary[1]:uvwxyz123456789
str_ary[2]:ghijke
str_ary[0]="abcdef"
str_ary[1]="uvwxyz1234ghijke"
str_ary[2]="ghijke"
C:\usr\c\> 

sample-017

Download : sample-017.c ( SJIS 版 )

sample-017.c
/*
 * 文字列の配列への読み込み (scanf/gets は危険)
 */

#include <stdio.h>

/*
 * main
 */

#define	MIN_SIZE	10	/* わざと小くした */
#define	ARY_SIZE	3

int main ( void ) {
  char str_ary[ARY_SIZE][MIN_SIZE];
  int i;

  for ( i = 0; i < ARY_SIZE; i++ ) {
	printf ( "str_ary[%d]:", i );
	scanf ( "%9s", str_ary[i] );
  }

  for ( i = 0; i < ARY_SIZE; i++ ) {
	printf ( "str_ary[%d]=\"%s\"\n", i, str_ary[i] );
  }

  return 0;
}
入力例
abcdef
uvwxyz123456789
ghijke
sample-017.c の実行結果
C:\usr\c\> sample-017
str_ary[0]:   abcdef
str_ary[1]:uvwxyz123
str_ary[2]:   456789
str_ary[0]="abcdef"
str_ary[1]="uvwxyz123"
str_ary[2]="456789"
C:\usr\c\> 

sample-018

Download : sample-018.c ( SJIS 版 )

sample-018.c
/*
 * 文字列の長さ (List 9-8 : p.216)
 */

#include <stdio.h>

/*
 * defines
 */

#define	EOS		'\0'

/*
 * unsigned int str_length ( const char str[] )
 *	文字列 (を表している..) str の長さを求める
 */

unsigned int str_length ( const char str[] ) {
  unsigned int length = 0;

  while ( str[length] != EOS ) {
	length++;
  }

  return length;
}

/*
 * main
 */

#define	MIN_SIZE	1024

int main ( void ) {
  char str[MIN_SIZE];
  int i;

  printf ( "文字列を入力してください : " );
  scanf ( "%s", str );		/* & が不要である事に注意 */

  printf ( "文字列「%s」の長さは %u です。\n", str, str_length ( str ) );

  return 0;
}
入力例
SEC
sample-018.c の実行結果
C:\usr\c\> sample-018
文字列を入力してください : SEC
文字列「SEC」の長さは 3 です。
C:\usr\c\>