我创建了一个struct
来对两个指针变量进行分组,以便我可以将地址存储在这些变量上。然后,我实例化结构并引用main
竞赛中的两个变量。根据用户输出比较两个字符串并返回所需的结果。
代码在这里
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <ctype.h>
typedef struct
{
char *name;
char *name2;
} names;
int main()
{
names nm;
printf("Please enter first string: ");
scanf("%s", nm.name)
printf("Please enter second string: ");
scanf("%s", nm.name2);
if(strcmp(nm.name, nm.name2) == 0)
printf("Strings %s and %s do matchn", nm.name, nm.name2);
else
printf("Strings %s and %s do not matchn", nm.name, nm.name2);
return 0;
}
我试图printf("%s", &nm.name);
我是新手 C 用户。 谢谢!
不使用struct
和指针变量的示例
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <ctype.h>
int main()
{
char name[20];
printf("Please enter first string: ");
scanf("%s", &name);
char name2[20];
printf("Please enter second string: ");
scanf("%s", &name2);
if(strcmp(name, name2) == 0)
printf("Strings %s and %s do matchn", name, name2);
else
printf("Strings %s and %s do not matchn", name, name2);
return 0;
}
gcc -Wall -Wextra -Wformat -pedantic -o strcmp strcmp.c
strcmp.c: In function ‘main’:
strcmp.c:10:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[20]’ [-Wformat]
strcmp.c:11:2: warning: ISO C90 forbids mixed declarations and code [-pedantic]
strcmp.c:13:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[20]’ [-Wformat]
strcmp.c:15:2: warning: implicit declaration of function ‘strcmp’ [-Wimplicit-function-declaration]
您需要分配内存 - 这是这里的共识。
但是没有人指出缓冲区溢出问题。 scanf("%s", pointer);
读取的字节数可能多于缓冲区中可用内存的字节数,从而损坏内存并导致程序崩溃。使用字段宽度规范来限制要读取的字符数:
char name[21];
scanf("%20s", name);
或者,如果您想要动态分配的缓冲区
char *name = new char[21];
scanf("%20s", name);
数组必须足够大,以接受所有序列和终止 NULL 字符。输入字符串在空格或最大字段宽度处停止,以先发生者为准。
地址。你提到了符号&。这是一个地址运算符。在您可能已经看到的某些示例中,它是必需的,因为scanf()
需要一个内存地址。
int val;
scanf("%d", &val);
您正在读取的是一个字符串而不是整数,如上例所示
char name[21]; // name is an address of memory allocated for 21 bytes
char *name; // same, name is an address, not allocated yet.
char name; // is a char variable, it hols a single character.
// If you need an address of the memory that holds that single character,
// you need to use &
char *pointer = &name; // Now pointer holds an address of name
请阅读有关 C/C++ 中的内存和变量声明的更多信息。你写道:printf("%s", &nm.name);
这将尝试打印随机内存区域。如果幸运的话,它会打印垃圾,如果不是,它会因内存访问违规而使程序崩溃。
nm 是一个结构体,name 是指向字符数组的指针。nm.name 是指向字符数组的指针。&nm.name 是指向数组指针的指针,但printf
将其解释为指向数组的指针。
对于您编辑的问题,您错误地使用了scanf
:
scanf("%s", &name);
应该是
scanf("%s", name);
你一定看过将scanf
与&
一起使用的例子,但在这种情况下,name
已经是一个char [20]
,当作为函数参数传递时,它会衰减成一个char *
。
您需要使指针指向某些内容,例如:
int main()
{
char buff1[20];
char buff2[20];
names nm;
nm.name = buff1;
nm.name2 = buff2;
按如下方式更改结构,您的代码就可以正常工作。
typedef struct
{
char name[20];
char name2[20];
}names;