【问题标题】:Searching for a string in an array without strcmp在没有 strcmp 的数组中搜索字符串
【发布时间】:2022-01-17 16:49:02
【问题描述】:

我有一个这种形式的结构:

typedef struct student{
    double student_no;
    char name[50];
    char surname[50];
    double phone_no;
    char mail[50];
};
struct student person[100];

printf("Student's mail address: ");
scanf("%s", person[i].mail); //i use codeblocks and it works without the sign &

首先我创建了一个邮件数组。然后我收到用户的邮件,然后检查它是否在我最初创建的数组中。我必须在没有strcmp() 的情况下这样做,这就是我卡住的地方。到目前为止,这是我尝试过的:

char *e1, *e2;
int comp;

typedef struct info{
    char email[50];
};
struct info mailaddress[0];

printf("Enter the mail address to search: ");
scanf("%s", mailaddress[0]);

for (int i = 0; i < u; i++) {
    for (int j = i + 1; j < u; j++) {
        e1 = person[i].mail;
        e2 = mailaddress[j].email;
        comp = 0;

        while (*e1 && *e2) {
            if (*e1 != *e2) {
                comp = *e1 - *e2;
                break;
            }

            ++e1;
            ++e2;
        }

        if (comp == 0)
            printf("%s\t  %s  %15.lf    %15.lf      %s\n",
                    person[i].name,
                    person[i].surname,
                    person[i].student_no,
                    person[i].phone_no,
                    person[i].mail);
    }
}

【问题讨论】:

  • 此声明 struct info mailaddress[0];无效 你不能声明一个元素为零的数组。
  • "我必须在没有 strcmp() 的情况下这样做" 了解 strcmp 的工作原理,然后编写您自己的版本。
  • while(*e1 &amp;&amp; *e2) 应该使用|| 而不是&amp;&amp;,以便在字符串长度不同时它可以工作。如果字符串与最短字符串的长度相同,则较长的字符串将大于短字符串。 (这假设所有字符都有非负值。)
  • 我想强调 1.8e9 的评论。我推荐这个策略: 第 1 步。编写程序,使用strcmp。 (是的,我知道,你不能这样做,但请耐心等待。)彻底调试你的程序,确保它在所有情况下都能正常工作。步骤 2. 编写您自己的 strcmp 版本,可能称为 my_strcmp。它应该和标准版本一样,接受两个const char * 参数,并返回一个int。第 3 步。(可选)编写一个单独的小程序来彻底测试您的my_strcmp。第 4 步。对第 1 步的程序进行简单更改以使用my_strcmp。

标签: arrays c string search


【解决方案1】:

这样试试

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>
#include <string.h>

#define NO_MAX       20
#define NAME_MAX     20
#define SURNAME_MAX  20
#define PHONE_NO_MAX 20
#define MAIL_NO_MAX  50

struct student{
    char    student_no[NO_MAX + 1];
    char    name[NAME_MAX + 1];
    char    surname[SURNAME_MAX + 1];
    char    phone_no[PHONE_NO_MAX + 1];
    char    mail[MAIL_NO_MAX + 1];
    struct student *ptr_next;
 };

struct student *ptr_head = NULL;
struct student *ptr_position;


void enter_item(char *ptr_label, char *ptr_result, int max){

    // enter item until pressed enter to finished
    char tmp[256];
    do {
        printf("%s: ", ptr_label);
        gets(tmp);
    } while((strlen(tmp) > max));
    strcpy(ptr_result, tmp);
}

void enter_list(void) {
    char more;
    struct student *ptr_new;
    do{
        // order dynamic memory
        ptr_new = (struct student *) malloc(sizeof(struct student));
        if(ptr_new) {
            // enter item
            enter_item("student_no", ptr_new->student_no, NO_MAX);
            enter_item("name",       ptr_new->name, NAME_MAX);
            enter_item("surename",   ptr_new->surname, SURNAME_MAX);
            enter_item("phone_no",   ptr_new->phone_no, PHONE_NO_MAX);
            enter_item("mail",       ptr_new->mail, MAIL_NO_MAX);

            // next item
            ptr_new-> ptr_next = ptr_head;
            ptr_head = ptr_new;

            // enter item again or not
            printf("- again(Y/N)? -");
            do{
               more = toupper(getch());
            } while(!(more=='Y' || more=='N'));
            printf(" %c\n\n", more);
        }
        else {
            printf("Memory isn't enough!\n");
            break;
        }
    } while(more == 'Y');
}


void search_mail() {
    // enter mail
    struct student *ptr_search;

    ptr_search = (struct student *) malloc(sizeof(struct student));
    enter_item("mail searching",       ptr_search->mail, MAIL_NO_MAX);
    char *mail = ptr_search->mail;

    // searching mail
    ptr_position = ptr_head;
    while(ptr_position) {
        if(strcmp(mail, ptr_position->mail) != 0) {
            ptr_position = ptr_position-> ptr_next;
        }
        else {
            printf("Email is found\n");
            return;
        }
    }
    printf("Email isn't found!\n");
}

int main()
{
    enter_list();
    search_mail();
    return 0;
}

结果:

【讨论】:

【解决方案2】:
bool streq(char *a, char *b)
{
    while (*a && *b && *a != *b)
        a++, b++;

    return !*a && !*b;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2011-07-04
    • 2023-03-13
    相关资源
    最近更新 更多