比较 C 中的两个字符串时出现问题(分段错误) 核心转储



我创建了一个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;

最新更新