为什么这段代码不起作用。只是试图检查用户输入是否与密码相同
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
将有一个地方来存储输入。否则你有内存损坏。
是的,指针未初始化。如果你调试它,你会得到一个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
您尚未初始化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
,或者是用于在声明中初始化另一个数组的字符串文字,否则“N-element array of”类型的表达式将被转换(“decay”)为类型为“pointer to ”的表达式,表达式的值将是数组第一个元素的地址。_Alignof
&
T
T
当pass
作为参数传递给scanf
and时,表达式strcmp
的类型从“N-element array of ”转换为“pointer to ”,表达式的值是, or的第一个元素的地址。这就是为什么您不需要在通话中使用操作员的原因。 pass
char
char
pass
&pass[0]
&
scanf
同样,在调用中,字符串文字“acopio”从“7-element array of ”( C++ 中)strcmp
类型的表达式转换为“pointer to ”。 char
const char
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);
}
初学者的简单代码....