文字列について
Re:文字列について
関数を作ってしまうのが普通ですね。
int _strlen(const char* str) { int i; for (i = 0; *str != '\0'; i++) { str++; } return i; } char* _strcat(char* str1, const char* str2) { char* tmp = str1; int i; for (i = 0; *str1 != '\0'; i++) { str1++; } for (i = 0; *str2 != '\0'; i++) { *str1 = *str2; str1++; str2++; } *str1 = '\0'; return tmp; }
Re:文字列について
サンプルです。
#include <stdio.h> #define BUFLEN (512) int main(void) { char s1[BUFLEN], s2[BUFLEN]; int len1, len2, i; printf("文字列s1:"), scanf("%s", s1); printf("文字列s2:"), scanf("%s", s2); for (len1 = 0; s1[len1] != '\0'; len1++) ; for (len2 = 0; s2[len2] != '\0'; len2++) ; printf("s1の長さ=%d, s2の長さ=%d\n", len1, len2); for (i = len1; i < len1 + len2; i++) s1 = s2[i-len1]; s1 = '\0'; printf("連結後のs1='%s'\n", s1); return 0; }
Re:文字列について
BUFLENは、結合後の文字列s1を格納するのに十分な大きさを表わす値です。
サンプルでは、文字列終端の'\0'を含めて512バイトまで対応している、ということです。
サンプルでは、文字列終端の'\0'を含めて512バイトまで対応している、ということです。
Re:文字列について
では、私は違った方向で・・ってやってること一緒ですが
文字列の長さがわからなくても、\0が出てくるまでカウントアップしてやればわかります。
最初のループの部分ですね。
次のループはs1は先ほど\0だったところをスタート地点にして、s2は最初をスタート地点にして代入をおこないます。
代入されたものが\0ではなかったらjをカウントアップして次々に代入していきます。
#include <stdio.h> int main(){ int i=0,j=0; char s1[512],s2[512]; printf("1つ目の文字列入力 ->\n") , scanf("%s",s1); printf("2つ目の文字列入力 ->\n") , scanf("%s",s2); printf("1: %s\n" ,s1); printf("2: %s\n\n",s2); while(s1!='\0') i++; while((s1[i+j]=s2[j]) != '\0') j++; printf("連結: %s\n",s1); return 0; }
文字列の長さがわからなくても、\0が出てくるまでカウントアップしてやればわかります。
最初のループの部分ですね。
次のループはs1は先ほど\0だったところをスタート地点にして、s2は最初をスタート地点にして代入をおこないます。
代入されたものが\0ではなかったらjをカウントアップして次々に代入していきます。
Re:文字列について
>strlen(),strcat()等の関数が使えなくて・・・。
ではこれならいいですか?
ではこれならいいですか?
#include <stdio.h> int main() { char s1[512], s2[512]; scanf("%s", s1); scanf("%s", s2); sprintf(s1, "%s%s", s1, s2); printf("%s\n", s1); return 0; }
Re:文字列について
管理人さんへ
> char s1[512],s2[512];
もし[/url]に512みたいな具体的な数値がなかったらどうなりますか?
> printf("1つ目の文字列入力 ->\n") , scanf("%s",s1);
> printf("2つ目の文字列入力 ->\n") , scanf("%s",s2);
は
printf("1つ目の文字列入力 ->\n");
scanf("%s",s1);
printf("2つ目の文字列入力 ->\n");
scanf("%s",s2);
と同等の意味なんですか?どちらの書き方でもOKですか?
2つともバカみたいな質問でごめんなさい。
> char s1[512],s2[512];
もし[/url]に512みたいな具体的な数値がなかったらどうなりますか?
> printf("1つ目の文字列入力 ->\n") , scanf("%s",s1);
> printf("2つ目の文字列入力 ->\n") , scanf("%s",s2);
は
printf("1つ目の文字列入力 ->\n");
scanf("%s",s1);
printf("2つ目の文字列入力 ->\n");
scanf("%s",s2);
と同等の意味なんですか?どちらの書き方でもOKですか?
2つともバカみたいな質問でごめんなさい。
Re:文字列について
>> char s1[512],s2[512];
>もし[/url]に512みたいな具体的な数値がなかったらどうなりますか?
[512]という数字は「配列の要素数」と呼ばれ、配列の要素をいくつ作るか示すものです。
宣言の時にはいくつ生成するか決めているので、具体的な数字を書いてやらないと、
コンパイラはいくつ配列要素を作ればいいかわからず、エラーを吐き出してしまいます。
しかし、省略できる時もあります。
char s1[/url]="省略可能なkakikata..";
このように宣言と同時に格納する文字を示してやれば、いくつ用意すればいいのか
わかりますのでエラーになりません。
こうすると、全角文字が5つ、半角文字が10文字あるから、配列要素は20個必要です。
文字列は最後に終端記号である\0を入れる必要がありますから、
合計21個配列要素が必要だとわかりますね。
つまり宣言と同時に初期化しないときには、配列要素数の省略は不可。
同時に初期化するなら省略は可能ということです。
後、コンマについてですが、
①,②,③
と書けば、①から順番に③まで処理をしろといういみなので、
普通にたてに書いても同じです。
2つの値を交換する時など、1行の処理が少ない時や、
短く書きたい時によく使用します。
>2つともバカみたいな質問でごめんなさい。
全然そんなことないので、少しでも疑問があれば、何でも聞いてくださいね。
>もし[/url]に512みたいな具体的な数値がなかったらどうなりますか?
[512]という数字は「配列の要素数」と呼ばれ、配列の要素をいくつ作るか示すものです。
宣言の時にはいくつ生成するか決めているので、具体的な数字を書いてやらないと、
コンパイラはいくつ配列要素を作ればいいかわからず、エラーを吐き出してしまいます。
しかし、省略できる時もあります。
char s1[/url]="省略可能なkakikata..";
このように宣言と同時に格納する文字を示してやれば、いくつ用意すればいいのか
わかりますのでエラーになりません。
こうすると、全角文字が5つ、半角文字が10文字あるから、配列要素は20個必要です。
文字列は最後に終端記号である\0を入れる必要がありますから、
合計21個配列要素が必要だとわかりますね。
つまり宣言と同時に初期化しないときには、配列要素数の省略は不可。
同時に初期化するなら省略は可能ということです。
後、コンマについてですが、
①,②,③
と書けば、①から順番に③まで処理をしろといういみなので、
普通にたてに書いても同じです。
2つの値を交換する時など、1行の処理が少ない時や、
短く書きたい時によく使用します。
>2つともバカみたいな質問でごめんなさい。
全然そんなことないので、少しでも疑問があれば、何でも聞いてくださいね。
Re:文字列について
> 先生がさせようとしていることを賢くうまく外して見せるのも
文字列の連結は、keichanさんがお書きになった
sprintf関数を使う方法が最良です。
標準関数のstrcatを使う場合、下手なコーディングをすると
strcatの連鎖地獄に陥ってしまいます。
しかし、sprintf関数を使えば、
sprintf(dest, "%s%s%s", src1, src2, src3);
のように、おそらく誰が見てもスッキリしたコードとなります。
コードがスッキリしている分、テストや保守が楽です。
文字列の連結は、keichanさんがお書きになった
sprintf関数を使う方法が最良です。
標準関数のstrcatを使う場合、下手なコーディングをすると
strcatの連鎖地獄に陥ってしまいます。
しかし、sprintf関数を使えば、
sprintf(dest, "%s%s%s", src1, src2, src3);
のように、おそらく誰が見てもスッキリしたコードとなります。
コードがスッキリしている分、テストや保守が楽です。