0

我创建了一个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 match\n", nm.name, nm.name2);  
    else
        printf("Strings %s and %s do not match\n", 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 match\n", name, name2);    
    else
        printf("Strings %s and %s do not match\n", 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]
4

4 回答 4

3

您需要分配内存- 这是这里的共识。

但是没有人指出缓冲区溢出问题。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将其解释为指向数组的指针。

于 2013-09-17T11:49:50.763 回答
2

对于您编辑的问题,您使用scanf不正确:

scanf("%s", &name);

应该

scanf("%s", name);

您一定看过使用scanfwith的示例&,但在这种情况下,name已经是a ,当作为函数参数传递时char [20],它会衰减为 a 。char *

于 2013-09-17T11:30:09.460 回答
1

您需要使指针指向某些东西,例如:

int main()
{
    char buff1[20];
    char buff2[20];
    names nm;
    nm.name = buff1;
    nm.name2 = buff2;
于 2013-09-17T11:30:18.367 回答
0

更改结构如下,您的代码将正常工作。

 typedef struct
 {
   char name[20];
   char name2[20];
 }names;
于 2013-09-17T11:27:57.683 回答