No.7ベストアンサー
- 回答日時:
No.2の改良版
int match (char* s1, char* s2){
int i;
for (i=0; s1[i]!='\0'; i++){
if (s1[i] != s2[i]){
break;
}
}
if (s1[i] == s2[i]) {
return 0;
} else {
return -1;
}
}
文字列終端までi番目の文字を比較して、全部同じなら0を返し、違っていたら-1を返します。s2がs1より短くても文字比較でループを抜けるので問題ないですね。
No.6
- 回答日時:
strcmpは2つの文字列が同じ時に0を返し、違うときはプラスかマイナスかで文字列の大小を比較できる。
qsortと相性がいいんです。
学校の先生にバレそうな感じに書いて見ました。
int my_strcmp(const char *s1, const char *s2)
{
while (*s1 && *s1 == *s2) {
s1++;
s2++;
}
return (int)*(const unsigned char*)s1 - (int)*(const unsigned char*)s2;
}
No.5
- 回答日時:
最初に、変更点を(これが最後のはず)。
下から4・5行目を以下に変更。
=======================
if (t2[i] == '\0'){
if(t1[i] != t2[i])
return -1;
else
break;
}
=======================
ポイントだけ。
1) #include <string.h> は不要。
2) int strlen(char*) を int strlen(char*, char*) に変更。
3) if(strlen( str1, str2 )) を
if(strlen( str1, str2 ) == -1) に変更。
4) /*strlen関数の定義*/ をmain関数の外におき、
#4(およびここで訂正した)match関数を strlen 関数に名前を変えて置く。
5) int c は不要。
とすれば、期待する動作をします。
が、どのように苦戦しているかを示したほうが、
良回答が得られたのではないかと思います。
No.4
- 回答日時:
#2 です。
先の例だと
ABC と ABCabc が一致してしまうので、以下のように変更。
int match (char *s1, char* s2){
int i;
int l1=0, l2=0; // 文字列1、2の長さ
char *t1, *t2; // 文字列1、2へのポインタ
for(i=0; s1[i]!='\0'; i++) l1++; // 文字列1の長さを取得
for(i=0; s2[i]!='\0'; i++) l2++; // 文字列2の長さを取得
l1 > l2 ? (t1 = s1, t2 = s2) : (t1 = s2, t2 = s1); // 長さを比較
for (i=0; t1[i] != 0; i++){
if (t1[i] != t2[i])
return -1;
if (t2[i] == '\0' && t1[i] != t2[i])
return -1;
}
return 0;
}
この回答への補足
このプログラム目的?は文字列の比較です。
補足ではありませんが、このソースの合わしたいですが苦戦しています。
#include <stdio.h>
#include <string.h>
int strlen(char*);
void main(void)
{
/*文字列の構造体*/
char str1[81];//str1の領域確保
char str2[81];//str2の領域確保
int c;
printf("文字列を入力して下さい。\n");
scanf("%s",str1);//str1に文字列入力
printf("入力した文字(文字列)は『%s』です。\n",str1);
printf("文字列を入力して下さい。\n");
scanf("%s",str2);//str2に文字列入力
printf("入力した文字(文字列)は『%s』です。\n",str2);
if(strlen( str1, str2 )){
printf("入力された文字(文字列)は一致しませんでした。\n");}
else{
printf("入力された文字(文字列)は一致しました。\n");}
/*strlen関数の定義*/
}
No.3
- 回答日時:
文字列を比較する関数はstrcmpです。
strlenは文字列の長さ(バイト数)を返す関数ですが、ご質問はどちらでしょう?
また、既存の関数を使用するのではなく、自作する理由が解りませんが..
文字列の長さを求めるのであれば、文字列の終端('\0')まで1バイトずつポインタをずらしながらループし、ループ回数をカウントすれば良いです。
文字列比較であれば、上述と同じループ中で、if文を使い1バイトずつ比較します。
No.2
- 回答日時:
文字列の比較には、
strcmp ()
を使います。string.h をインクルードする必要があります。
strlen は文字列の長さを取得する関数です。
自作するなら、配列の各項ごとに比較するしかないと思います。
int match (char* s1, char* s2){
int i;
for (i=0; s1[i]!='\0'; i++){
if (s1[i] != s2[i]){
return -1;
}
}
return 0;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- 数学 至急!!二次関数について aは定数とする。関数y=-x²+2ax-4a+1(-1≦x≦2)の最小値を 5 2023/06/27 23:28
- 数学 至急です 3点を通る二次関数で (1,0)(-1,0)(0,1/2)を通る二次関数って求められますか 3 2023/07/07 21:42
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 malloc 関数を使って教えてください。 入出力例1 3 2022/07/21 09:36
- 時計・電卓・電子辞書 至急! CASIOの関数電卓を弄っている間に分数が帯分数表示になってしまいした。これを治すにはどうし 1 2023/05/11 15:03
- 数学 高校の数Ⅱの三角関数の問題です。至急です!! sin7/12π=sin(π/3+π/4) =sinπ 4 2022/11/29 20:00
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
strchr() の第2引数はなぜ int ...
-
CStringをwchar_tに変換したい
-
_TCHAR*での引数の読み込み
-
間接操作のレベルとは
-
fgetsなどのときのstdinのバッ...
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
ftoa の作り方
-
標準ライブラリ関数の自作につ...
-
c言語です。
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
構造体のアライメント調整
-
間接参照のレベルが異なっています
-
文字列から空白を取り除きたい...
-
起動時の引数の取得方法が分か...
-
コマンドラインに入力されてい...
-
配列をnビットシフトする
-
RGB→YUV変換のプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報