与指针不是在C strcmp的工作(strcmp with pointers not working

2019-07-03 14:58发布

为什么这个代码不工作。 只是想检查,如果用户输入相同密码

char *pass;

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


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

Answer 1:

你没有实际分配任何空间来放置数据。 限定指针只是限定了可容纳的数据的块的地址的变量,它不分配块。

你有几个选项,动态分配内存空间离堆写进去,使指针指向它。 或在堆栈上使用静态分配的内存,它的地址传递给您的来电。 还有一点好处动态内存在这种情况下(因为它在使用临时小)。 你将有更多的工作要做,如果你使用动态内存 - 你必须确保你有你的要求分配它的时候,确保你已经给它回来时,你就大功告成了,并确保你不使用它你给它回来后(在棘手的一大应用,相信我!)这只是更多的工作,而你似乎并不需要额外的努力。

下面的例子也需要显著错误检查,但给你的总体思路。

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)


Answer 2:

pass是一个未初始化的指针,并尝试写进去。 你要分配足够的内存来保存一个字符串。 例如, char pass[SIZE]将更好地工作。



Answer 3:

您需要分配pass这样的scanf将存储输入的地方。 否则,你有内存损坏。



Answer 4:

是指针未初始化。 如果调试它,你会得到一个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


Answer 5:

您还没有初始化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 ”将被转换(“衰变“),以类型的表达式‘指针T ’,并且表达式的值是数组的第一元素的地址。

传递时, pass作为参数传递给scanfstrcmp ,该表达式的类型pass从“的N元件阵列转换char ”到“指针char ”,并且表达式的值是第一元素的地址pass ,或&pass[0] 这就是为什么你不需要使用&运营商在scanf调用。

类似地,在strcmp呼叫,字符串文字“acopio”是从类型“的7个元素的数组的表达转换char ”( const char在C ++),以“指针char ”。



Answer 6:

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

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



文章来源: strcmp with pointers not working in C