このコードが機能しない理由。ユーザー入力がパスワードと同じかどうかを確認しようとしています
char *pass;
printf("Write the password: ");
scanf("%s", pass); // Because is a pointer the & is out ?
if( strcmp( pass , "acopio") == 0)
データを配置するためのスペースを実際に割り当てていません。ポインタを定義すると、データ ブロックのアドレスを保持できる変数が定義されるだけで、ブロックは割り当てられません。
いくつかのオプションがあり、ヒープから動的メモリを割り当てて書き込み、ポインターがそれを指すようにします。または、スタックで静的に割り当てられたメモリを使用し、そのアドレスを呼び出しに渡します。この場合、動的メモリの利点はほとんどありません (一時的に使用され、小さいため)。動的メモリを使用した場合は、より多くの作業が必要になります。割り当て時に要求したものが得られたことを確認し、完了したらそれを返却したことを確認し、使用しないようにする必要があります。あなたがそれを返した後(大きなアプリではトリッキーです、私を信じてください!)それはただの仕事であり、あなたはその余分な努力を必要としないようです.
以下の例も重要なエラー チェックを必要としますが、一般的な考え方を示します。
例えば
char *pass = malloc (SOMESIZE);
printf("Write the password: ");
scanf("%s", pass);
if( strcmp( pass , "acopio") == 0)
また
char pass[SOMESIZE];
printf("Write the password: ");
scanf("%s", pass);
if( strcmp( pass , "acopio") == 0)
pass
は初期化されたポインタであり、それに書き込もうとしています。文字列を保持するのに十分なメモリを割り当てる必要があります。たとえば、char pass[SIZE]
よりうまく機能します。
に入力を格納する場所を確保するpass
ために、を割り当てる必要があります。scanf
そうしないと、メモリが破損します。
pass
入力を格納するバッファまたは他の場所を指すように初期化していません。
このような単純なものの場合、ポインターpass
の代わりに配列として宣言できます。char
char pass[N]; // where N is large enough to hold the password plus a 0 terminator
scanf("%s", pass);
if (strcmp(pass, "acopio") == 0)
{
...
}
sizeof
、_Alignof
、または単項演算子のオペランドである場合、または&
宣言で別の配列を初期化するために使用される文字列リテラルである場合を除いて、型 "N 要素配列 " の式T
は変換 ("decay") されます。型「へのポインタ」の式T
であり、式の値は配列の最初の要素のアドレスになります。
pass
and に引数として渡すscanf
とstrcmp
、式の型は「 pass
のN要素配列char
」から「へのポインタ」に変換され、式の値は、またはchar
の最初の要素のアドレスになります。そのため、呼び出しで演算子を使用する必要はありません。pass
&pass[0]
&
scanf
同様に、strcmp
呼び出しでは、文字列リテラル "acopio" は、型 "" の 7 要素配列char
( const char
C++ の場合) " の式から "pointer to " に変換されますchar
。
#include<stdio.h>
main()
{
int mystrcmp(char *,char *);
char s1[100],s2[100];
char *p1,*p2;
p1=s1;
p2=s2;
printf("Enter the first string..?\n");
scanf("%s",p1);
printf("Enter the second string..?\n");
scanf("%s",p2);
int x=mystrcmp(p1,p2);
if(x==0)
printf("Strings are same\n");
else
printf("Strings are not same..\n");
}
int mystrcmp(char *p1,char *p2)
{
while(*p1==*p2)
{
if(*p1=='\0' || *p2=='\0')
break;
p1++;
p2++;
}
if(*p1=='\0' &&as *p2=='\0')
return(0);
else
return(1);
}
初心者向けのシンプルなコード....
はい、ポインタは初期化されていません。デバッグすると、access violation or segmentation fault
. コードは次のように変更できます。
char pass[22];//22 can be replaced with other number
printf("Write the password: ");
scanf("%s", pass);
if( strcmp( pass , "acopio") == 0)
printf("fu");//just to check