Редактирование массива структуры в другой функции - PullRequest
0 голосов
/ 21 ноября 2018

Как я мог или не мог заявить в предыдущем вопросе, я новичок в программировании на C и имею опыт работы только с Java, поэтому я довольно некомпетентен в использовании Structs и Pointers и, возможно, плохо разбирался в этих понятиях.в первый раз.

Итак, я играл с C, и когда я попробовал следующую программу ниже:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define buf_sz 32

struct friends {
    char name[buf_sz];
    int number;
};
typedef struct friends friend;

void addfriend (friend * friendArr, int index);
void removefriend (friend * friendArr);

void main () {

    int index;
    int troll;

    friend friendArr[50];

    printf("1. Add Friend Name, 2. Remove Friend. Other buttons. Do nothing\n");
    scanf(" %d", &troll);

    while ((troll == 1) && (troll == 2)) {
        switch (troll) {
            case 1: addfriend(friendArr, index);
                index++;
                break;
            case 2: removefriend(friendArr);
                break;
            default: break;
        }
    }

    for (int i = 0; i < 50; i++) {
        if (friendArr[i].name != NULL) {
            printf("%s\t%d\n", friendArr[i].name, friendArr[i].number);
        }
    }

}

void addfriend (friend * friendArr, int index) {

    char buf[buf_sz];
    int number;

    printf("Add a friend's name\n");
    fgets(buf, buf_sz-1, stdin);
    sscanf(buf, " %s", friendArr[index].name);

    printf("Add his number\n");

    scanf(" %d", &number);
    friendArr[index].number = number;

}

void removefriend (friend * friendArr) {

    char buf[buf_sz];
    char name[buf_sz];
    int check;

    printf("Add a friend's name you wanna remove\n");

    fgets(buf, buf_sz-1, stdin);
    sscanf(buf, " %s", name);

    for (int i = 0; i < 50; i++) {
        if (friendArr[i].name == name) {
            strcpy(friendArr[i].name, "");
        }
    }

}

Мой вывод был задан как:

1. Add Friend Name, 2. Remove Friend. Other buttons. Do nothing
1
@R      2009984
        0
        624
        4
 v      144
        0
l�      685382481
        32767
��G�    364104144
       0
0�G�    368262747
       32517
@�G�    440903072
�       32517
        368167105
       32517
�G�     370332944
       32517
_�g     370428400
       32517
        368167105
       32517
        364032000
       0
        0
        32517
�I      368217097
       0
��G�    368166640
       32517
���     370428400
       0
'       0
        0
pQ      368182487
       32517
        370431760
       0
���     0
        0
8W      0
        32767
W       440904224
�       32517
���     370432664
       0
        0
        32517
��G�    368232864
       32767

По сути, это набор странных чисел, значение которых я не понимаю.

Желаемым выводом будет сообщение для печати вопроса, добавление имени и номера пользователя, если нажата 1, и удаление пользователя.если была нажата клавиша 2., распечатайте всех пользователей.

Я считаю, что проблема заключается в том, что я передаю массив в struct, но я не уверен.В местах, где я ошибался, но я не мог найти ничего, что могло бы помочь.

Можете ли вы, дружелюбные люди, указать, где я ошибся?

1 Ответ

0 голосов
/ 21 ноября 2018

Вам нужно инициализировать свои переменные:

void main () {

    int index = 0;    // <<-- THIS 
    int troll;

    // Make some friends
    friend friendArr[50];

    for (int i=0; i<50; i++)
        friendArr[i].name[0] = '\0';   // <<-- AND THE NAME

Когда вы распечатываете список друзей, имена участников не могут сравниваться с NULL, поскольку они не являются указателями.(ну их можно сравнить, но это не имеет смысла).Было бы лучше, после того как набор данных инициализирован пустым, чтобы проверить, есть ли набор имен.

for (int i = 0; i < 50; i++) 
{
    if (friendArr[i].name[0] != '\0') 
    {
        printf("%s\t%d\n", friendArr[i].name, friendArr[i].number);
    }
}

Также, как указывает @Groo, сравнивать строки C с * недопустимо1008 *.Вместо этого используйте strcmp().Здесь мы проверяем, что strcmp() возвращает 0, когда строки идентичны.

for (int i = 0; i < 50; i++) 
{
    if (strcmp(friendArr[i].name, name) == 0) 
    {
        strcpy(friendArr[i].name, "");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...