異なる文字列を比較するプログラムを書いています。具体的には、で終わる化学元素OH
。文字列がOH
。で終わる場合は-1を返す必要があります。しかし、私のプログラムは機能しません。私はどこが間違っていますか?
#include <stdio.h>
#include <string.h>
int hydroxide(char *string);
int main() {
char *string;
printf("Enter String:");
gets(string);
printf("%d", hydroxide(string));
}
int hydroxide(char *string) {
string = strrchr(string, 'O');
if (string != NULL)
return (strcmp(string, "OH"));
return (-1);
}
手始めに、関数のロジックは間違っています。
通常、このような関数は、「はいまたはいいえ」などの質問に答えたときに、論理に対応する、または1
論理に対応する(または正の値)を返す必要があります。true
0
false
この呼び出し
strcmp(string, "OH")
2つの文字列が等しい場合は0を返します。それ以外の場合、関数は、最初の文字列が2番目の文字列より大きいか小さいかに応じて、正または負の値を返すことができます。
これとは別にconst
、渡された文字列は関数内で変更されないため、関数パラメーターには修飾子が必要です。
文字列を読み取るメモリを予約していません。宣言されたポインタ
char *string;
は初期化されておらず、値は不確定です。したがって、この呼び出し
gets(string);
未定義の動作を呼び出します。
この機能gets
は安全でない機能であり、C標準ではサポートされていないことを考慮してください。代わりに、標準のC関数を使用する必要がありますfgets
。
そして、関数がより一般的なものになると、はるかに良くなります。それは、文字列の指定されたサフィックスをチェックできるときです。常により一般的な関数を書くようにしてください。この場合、それらは再利用可能です。
以下に、関数の定義方法を示すデモプログラムがあります。
#include <stdio.h>
#include <string.h>
int hydroxide( const char *s, const char *suffix )
{
size_t n1 = strlen( s );
size_t n2 = strlen( suffix );
return !( n1 < n2 ) && strcmp( s + n1 - n2, suffix ) == 0;
}
int main(void)
{
enum { N = 100 };
char s[N];
while ( 1 )
{
printf( "Enter a String (empty string - exit): " );
if ( fgets( s, N, stdin ) == NULL || s[0] == '\n' ) break;
s[ strcspn( s, "\n" ) ] = '\0';
printf( "%s\n", hydroxide( s, "OH" ) ? "true" : "false" );
}
return 0;
}
プログラムの出力は次のようになります
Enter a String (empty string - exit): brogrammerOH
true
Enter a String (empty string - exit):
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加