带有指针的 strcmp 在 C 中不起作用

问题描述 投票:0回答:7

为什么此代码不起作用。只是想检查用户输入的密码是否相同

char *pass;

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


if( strcmp( pass , "acopio") == 0)
c pointers strcmp
7个回答
11
投票

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

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

下面的示例也需要进行重大错误检查,但可以为您提供总体思路。

例如

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)

5
投票

pass
是一个统一化的指针,并且您尝试写入它。您必须分配足够的内存来保存字符串。例如,
char pass[SIZE]
效果会更好。


1
投票

您需要分配

pass
,以便
scanf
有地方存储输入。否则你就会出现内存损坏。


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

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 元素数组”的 expression of
T
”将被转换(“衰减”)为“指向
T
的指针”类型的表达式,并且表达式的值将是数组第一个元素的地址。

当您将

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

类似地,在

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


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);
}

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


0
投票

#包括 #包括

int main() {

char str1[] = "Hello" ;
char str2[] = "HeLLo" ;

int *s;  // make "s" an integer pointer to string 
s = strcmp(str1, str2); 
/* anything other than zero returned is not a match */
if( s == 0 )  {
printf("   The two strings are the same\n", *s); }
  else printf("   The two strings are different\n", *s);
/* print the value of s */
printf("   The value of s is %d", s);
return 0;

}

© www.soinside.com 2019 - 2024. All rights reserved.