• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語の文字列の取り扱いが分かりません)

C言語の文字列の取り扱いについて

このQ&Aのポイント
  • C言語で文字列の取り扱いについて質問があります。strcpy, strcat, strcmp, strlenを使わずに書くことはできるのでしょうか?
  • 先生に相談したところ、ポインタを使うとのことでしたが、ポインタを使わずに実現する方法はあるのでしょうか?
  • 以下のプログラムではユーザーから2つの文字列を受け取り、strlenで文字列の長さを確認し、strcmpで比較しています。また、strcatで文字列を結合し、strcpyでコピーしています。

質問者が選んだベストアンサー

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

>以下のソースコードを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)

noname#137556
noname#137556
回答No.7

#6 について すみません。 指摘内容がどうも理解できません。 何と何が同じに「見える」のか? 「結果的に」「見える」ということは、実は違うということなのか? 注意が必要とは、何か問題が起こるということなのか? # 参考 URL に示されたような、 # 配列とポインタの違いについては理解しております。

回答No.6

#4です。 >int mystrlen(char *str) と書いても全く同じ。 >関数 mystrlen に配列を渡そうとすると、実際にはその最初の要素へのポインタが渡ります。 関数 mystrlen に配列を渡そうとすると、その最初の要素へのアドレスが渡ります。 int mystrlen(char *str) と書くとポインターにその最初の要素へのアドレスが渡ります。 結果として同じに見えるので、注意が必要です。 http://www.nurs.or.jp/~sug/soft/tora/tora9.htm

noname#137556
noname#137556
回答No.5

int mystrlen(char str[]) {   int i;   for (i=0 ; str[i] ; i++) {   }   return i; } str は char の配列のように見えますが、実際には char へのポインタです。 int mystrlen(char *str) と書いても全く同じ。 関数 mystrlen に配列を渡そうとすると、実際にはその最初の要素へのポインタが渡ります。 ちょっとややこしいですが、C で文字列を取り扱おうとすると、現実的にポインタの使用は避けられないのです。

回答No.4

#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

回答No.2

>ポインタとかいうのを使うのだそうですが、それを使わずに書くことってできるんですか?  できない。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>i = strcmp(str1, str2); >if (!i) >printf("two word-lines are same length.\n"); strcmp()の戻り値で、2つの文字列が同じ長さであることは判定「できません」。 考え直しましょう。

関連するQ&A