- ベストアンサー
C言語の文字列の取り扱いについて
- C言語で文字列の取り扱いについて質問があります。strcpy, strcat, strcmp, strlenを使わずに書くことはできるのでしょうか?
- 先生に相談したところ、ポインタを使うとのことでしたが、ポインタを使わずに実現する方法はあるのでしょうか?
- 以下のプログラムではユーザーから2つの文字列を受け取り、strlenで文字列の長さを確認し、strcmpで比較しています。また、strcatで文字列を結合し、strcpyでコピーしています。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>以下のソースコードをstrcpy , strcat , strcmp , strlen を使わずに書く >ポインタとかいうのを使うのだそうですが、それを使わずに書くことってできるんですか? 授業では扱われない「裏道」ってことですね。愚直なまでに・・↓。 ただ、 uni is bigger than fortissimo. とはならず uni is smaller than fortissimo. となってしまいますが・・。 #include <stdio.h> int LengthGet( char str[] ) { int i; for( i = 0; i < 80; i++ ){ if( '\0' == str[ i ] ) return( i ); } return( 0 ); } int main( void ) { char str1[80], str2[80]; int iLen1, iLen2, i, j; printf( "INPUT 1st word-line. : " ); gets( str1 ); printf( "INPUT 2nd word-line. : " ); gets( str2 ); iLen1 = LengthGet( str1 ); iLen2 = LengthGet( str2 ); printf( "%s is %d moji long.\n", str1, iLen1 ); printf( "%s is %d moji long.\n", str2, iLen2 ); if( iLen1 == iLen2 ) printf( "two word-lines are same length.\n" ); if( iLen1 < iLen2 ) printf( "%s is smaller than %s.\n", str1, str2 ); if( iLen1 > iLen2 ) printf( "%s is bigger than %s.\n", str1, str2 ); if( ( iLen1 + iLen2 ) < 80 ){ for( i = 0; i < iLen2; i++ ) str1[ iLen1++ ] = str2[ i ]; str1[ iLen1 ] = '\0'; printf( "%s\n", str1 ); } for( j = 0, i = 0; i < iLen2; i++ ) str1[ j++ ] = str2[ i ]; str1[ j ] = '\0'; printf( "%s %s\n", str1, str2 ); return( 0 ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
その他の回答 (6)
#6 について すみません。 指摘内容がどうも理解できません。 何と何が同じに「見える」のか? 「結果的に」「見える」ということは、実は違うということなのか? 注意が必要とは、何か問題が起こるということなのか? # 参考 URL に示されたような、 # 配列とポインタの違いについては理解しております。
- 和泉 博(@hiroshi09s)
- ベストアンサー率54% (59/109)
#4です。 >int mystrlen(char *str) と書いても全く同じ。 >関数 mystrlen に配列を渡そうとすると、実際にはその最初の要素へのポインタが渡ります。 関数 mystrlen に配列を渡そうとすると、その最初の要素へのアドレスが渡ります。 int mystrlen(char *str) と書くとポインターにその最初の要素へのアドレスが渡ります。 結果として同じに見えるので、注意が必要です。 http://www.nurs.or.jp/~sug/soft/tora/tora9.htm
int mystrlen(char str[]) { int i; for (i=0 ; str[i] ; i++) { } return i; } str は char の配列のように見えますが、実際には char へのポインタです。 int mystrlen(char *str) と書いても全く同じ。 関数 mystrlen に配列を渡そうとすると、実際にはその最初の要素へのポインタが渡ります。 ちょっとややこしいですが、C で文字列を取り扱おうとすると、現実的にポインタの使用は避けられないのです。
- 和泉 博(@hiroshi09s)
- ベストアンサー率54% (59/109)
#3さんの sprintf() バージョンです。 #include <string.h> #include <stdio.h> #define SIZE 80 int _strlen(char buf[]); int main(void) { char str1[SIZE], str2[SIZE]; int i, _strlen1,_strlen2; printf("INPUT 1st word-line. : "); gets(str1); printf("INPUT 2nd word-line. : "); gets(str2); /*文字列(word-line)の長さを確認します。*/ printf("%s is %d moji long.\n", str1, _strlen1=_strlen(str1)); printf("%s is %d moji long.\n", str2, _strlen2=_strlen(str2)); /*文字列を比較します。*/ i = _strlen1 - _strlen2; if (i==0) printf("two word-lines are same length.\n"); else if (i < 0) printf("%s is smaller than %s.\n", str1, str2); else printf("%s is bigger than %s.\n", str1, str2); /*十分なスペースがあるのなら、str2をstr1の最後に結合させます。*/ if((_strlen1 + _strlen2) < SIZE ){ sprintf(str1+_strlen1, "%s", str2); printf("%s\n", str1); } /*str2をstr1にコピーする*/ sprintf(str1, "%s", str2); printf("%s %s\n", str1, str2); return 0; } int _strlen(char buf[]) { int i=0; while(buf[i]) i++; return i; } ----- 実行結果 ----- INPUT 1st word-line. : uni INPUT 2nd word-line. : fortissimo uni is 3 moji long. fortissimo is 10 moji long. uni is smaller than fortissimo. unifortissimo fortissimo fortissimo
- yaemon_2006
- ベストアンサー率22% (50/220)
>ポインタとかいうのを使うのだそうですが、それを使わずに書くことってできるんですか? できない。
- asuncion
- ベストアンサー率33% (2127/6289)
>i = strcmp(str1, str2); >if (!i) >printf("two word-lines are same length.\n"); strcmp()の戻り値で、2つの文字列が同じ長さであることは判定「できません」。 考え直しましょう。