7

このコードが機能しない理由。ユーザー入力がパスワードと同じかどうかを確認しようとしています

char *pass;

printf("Write the password: ");
scanf("%s", pass); // Because is a pointer the & is out ?


if( strcmp( pass , "acopio") == 0)
4

6 に答える 6

10

データを配置するためのスペースを実際に割り当てていません。ポインタを定義すると、データ ブロックのアドレスを保持できる変数が定義されるだけで、ブロックは割り当てられません。

いくつかのオプションがあり、ヒープから動的メモリを割り当てて書き込み、ポインターがそれを指すようにします。または、スタックで静的に割り当てられたメモリを使用し、そのアドレスを呼び出しに渡します。この場合、動的メモリの利点はほとんどありません (一時的に使用され、小さいため)。動的メモリを使用した場合は、より多くの作業が必要になります。割り当て時に要求したものが得られたことを確認し、完了したらそれを返却したことを確認し、使用しないようにする必要があります。あなたがそれを返した後(大きなアプリではトリッキーです、私を信じてください!)それはただの仕事であり、あなたはその余分な努力を必要としないようです.

以下の例も重要なエラー チェックを必要としますが、一般的な考え方を示します。

例えば

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)
于 2012-11-06T14:44:38.773 に答える
4

passは初期化されたポインタであり、それに書き込もうとしています。文字列を保持するのに十分なメモリを割り当てる必要があります。たとえば、char pass[SIZE]よりうまく機能します。

于 2012-11-06T14:29:20.353 に答える
1

に入力を格納する場所を確保するpassために、を割り当てる必要があります。scanfそうしないと、メモリが破損します。

于 2012-11-06T14:29:54.937 に答える
0

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であり、式の値は配列の最初の要素のアドレスになります。

passand に引数として渡すscanfstrcmp、式の型は passのN要素配列char」から「へのポインタ」に変換され、式の値は、またはcharの最初の要素のアドレスになります。そのため、呼び出しで演算子を使用する必要はありません。pass&pass[0]&scanf

同様に、strcmp呼び出しでは、文字列リテラル "acopio" は、型 "" の 7 要素配列char( const charC++ の場合) " の式から "pointer to " に変換されますchar

于 2012-11-06T15:01:08.813 に答える
0
#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);
}

初心者向けのシンプルなコード....

于 2016-01-26T20:34:42.647 に答える
0

はい、ポインタは初期化されていません。デバッグすると、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
于 2012-11-06T14:51:14.217 に答える