C言語における文字列の扱い
C言語には、C++やJavaと違い文字列型(string型)は存在しません。
文字列はchar型の配列として表現されます。そのため、ライブラリ(主にstring.h)を使わないと
文字列処理ができないので関数リファレンスが手元にあると便利です。
文字列はchar型の配列として表現されます。そのため、ライブラリ(主にstring.h)を使わないと
文字列処理ができないので関数リファレンスが手元にあると便利です。
文字列の宣言
cahr str[80] = "hoge";
文字列を逆にする関数
/*
* 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>をインクルードすればreverse()という関数が使えるので実装する必要がなくなります。
/*
* 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" ){
reverse( s.begin() , s.end() );
cout << "output: " << 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 ではそんなことは関係ねー、そんなの関係ねー。
...