strcmp指针不能在C中工​​作

时间:2012-11-06 14:28:08

标签: c pointers strcmp

为什么此代码无效。只是试图检查用户输入是否与密码相同

char *pass;

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


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

6 个答案:

答案 0 :(得分:10)

您实际上没有分配任何空间来放置数据。定义一个指针只是定义一个可以保存数据块地址的变量,它不会分配该块。

您有几个选项,从堆中分配动态内存以写入并使指针指向它。或者在堆栈上使用静态分配的内存并将其地址传递给您的呼叫。在这种情况下,动态内存几乎没有什么好处(因为它暂时使用而且很小)。如果使用动态内存,你还有更多工作要做 - 你必须确保在分配时得到了你所要求的内容,并确保在完成后你已经回复了它并确保你不使用它在你给它回来之后(在一个大应用程序中很棘手,相信我!)这只是更多的工作,你似乎不需要额外的努力。

以下示例还需要进行重大错误检查,但请提供一般性建议。

e.g。

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)

答案 1 :(得分:3)

pass是一个未初始化的指针,你试图写入它。你必须分配足够的内存来保存字符串。例如,char pass[SIZE]会更好。

答案 2 :(得分:1)

您需要分配pass,以便scanf能够存储输入。否则你会有内存损坏。

答案 3 :(得分: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

答案 4 :(得分: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或一元&运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字, >“{元素数组T”类型的>表达式将被转换(“衰减”)为“指向T的指针”类型的表达式,表达式的值将是数组第一个元素的地址。

当您将pass作为参数传递给scanfstrcmp时,表达式 pass的类型将从“N”转换为元素数组char“到”指向char的指针“,表达式的值是pass&pass[0]的第一个元素的地址。这就是您不需要在&电话中使用scanf运算符的原因。

类似地,在strcmp调用中,字符串文字“acopio”从类型为“{元素数组char”(C ++中的const char)的表达式转换为“指向char的指针。

答案 5 :(得分: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);
}

初学者的简单代码....