「C言語における文字列の扱い」の編集履歴(バックアップ)一覧に戻る
C言語における文字列の扱い」を以下のとおり復元します。
**C言語における文字列の扱い

C言語には、C++やJavaと違い文字列型(string型)は存在しません。
文字列はchar型の配列として表現されます。そのため、ライブラリ(主にstring.h)を使わないと
文字列処理ができないので関数リファレンスが手元にあると便利です。

***文字列の宣言
 char str[] = "hoge";
 cahr str2[80] = "foo";

***文字列を逆にする関数
 /*
  *	reverse_string.c
  *	by otaks , 2011-01-14
  */
 #include <stdio.h>
 #include <string.h>
 
 //引数strを逆にしてstrに代入する関数
 void reverseString(char *str){
 	int length = strlen(str), i;
 	char temp;
 
 	for(i=0 ; i<length/2 ; i++){
 		temp = str[length-i-1];
 		str[length-i-1] = str[i];
 		str[i] = temp;
 	}
 } 
  
 int main(){
 	char str[80];
 
 	printf("文字列を入力してください:");
 	scanf("%s" , str);
 	reverseString(str);
 	printf("%s \n", str);
 
 	return 0;
 }

 C++であれば<alrogithm>をインクルードすればinverse()という関数が使えるので実装する必要がなくなります。
 /*
  *	reverse_string.cpp
  *	by otaks , 2011-01-14
  */
 #include <iostream>
 #include <string>
 #include <algorithm>
 using namespace std;
 
 int main(){
 	string s;
 
 	while( cin >> s , str!="quit" ){
 		inverse( s.begin() , s.end() );
 		cout << "output: " << reverseStirng( str ) << endl;
 	}
 }


***文字列処理に関する関数
string.h で定義されている文字列処理の関数には、文字数を指定するものがあります。こっちを使った方が安全性が高いです。理由は、自分で作ってみればわかります。例えば、 strlen を自作するなら、
 size_t myStrlen(char *s){
 	int i;
 	for(i = 0; s[i] != '\0'; ++i);
 	return (size_t)i;
 }
こんな感じに実装できると思います。よく考えてください。もし配列上に '\0' のものがなければ、配列の領域を超えてアクセスしてしまうことになります。なので、配列の長さを受け取って、
 size_t myStrnlen(char *s, size_t len){
 	int i;
 	for(i = 0; s[i] != '\0' && i < len; ++i);
 	return (size_t)i;
 }
こうすることで配列の長さを超えてアクセスしてしまうということがなくなります。だから、 strlen を使うより strnlen を使う方が安全なのです。まあ ACM ではそんなことは関係ねー、そんなの関係ねー。



















...

復元してよろしいですか?

目安箱バナー