アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。
C言語で分からないことがあり、質問させていただきました。
学校で、文字列の取り扱いを習いました。
そこで質問なんですが、以下のソースコードをstrcpy , strcat , strcmp , strlen を使わずに書くことってできないですか?

先生に質問したところ、ポインタとかいうのを使うのだそうですが、それを使わずに書くことってできるんですか?もしよろしければお願いします。
以下のプログラムですが、ユーザーから2つの文字列を受けて、そこから4つの文字列関数を使ってみましょう、というやつです。実行結果も貼っておきますね。

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

int main(void)
{
char str1[80], str2[80];
int i;

printf("INPUT 1st word-line. : ");
gets(str1);
printf("INPUT 2nd word-line. : ");
gets(str2);

/*文字列(word-line)の長さを確認します。*/
printf("%s is %d moji long.\n", str1, strlen(str1));
printf("%s is %d moji long.\n", str2, strlen(str2));

/*文字列を比較します。*/
i = strcmp(str1, str2);
if (!i)
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((strlen(str1) + strlen(str2)) < 80 ){
strcat(str1, str2);
printf("%s\n", str1);
}
/*str2をstr1にコピーする*/
strcpy(str1, str2);
printf("%s %s\n", str1, str2);

「C言語の文字列の取り扱いが分かりません」の質問画像

A 回答 (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 );
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
    • good
    • 0

#6 について



すみません。
指摘内容がどうも理解できません。

何と何が同じに「見える」のか?
「結果的に」「見える」ということは、実は違うということなのか?
注意が必要とは、何か問題が起こるということなのか?

# 参考 URL に示されたような、
# 配列とポインタの違いについては理解しております。
    • good
    • 0

#4です。




>int mystrlen(char *str) と書いても全く同じ。
>関数 mystrlen に配列を渡そうとすると、実際にはその最初の要素へのポインタが渡ります。


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

int mystrlen(char str[])


{
  int i;
  for (i=0 ; str[i] ; i++) {
  }
  return i;
}

str は char の配列のように見えますが、実際には char へのポインタです。
int mystrlen(char *str) と書いても全く同じ。
関数 mystrlen に配列を渡そうとすると、実際にはその最初の要素へのポインタが渡ります。

ちょっとややこしいですが、C で文字列を取り扱おうとすると、現実的にポインタの使用は避けられないのです。
    • good
    • 0

#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
    • good
    • 0

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


 できない。
    • good
    • 0

>i = strcmp(str1, str2);


>if (!i)
>printf("two word-lines are same length.\n");

strcmp()の戻り値で、2つの文字列が同じ長さであることは判定「できません」。
考え直しましょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!