在另一个函数中编辑结构数组

时间:2018-11-20 22:15:59

标签: c arrays struct

正如我在上一个问题中可能没有提到的那样,我是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,但是我不确定。

我到处都在搜索Stack Overflow,以查找可能出错的地方,但找不到任何有用的东西。

您友善的人能指出我出了错吗?

1 个答案:

答案 0 :(得分:0)

您需要初始化变量:

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字符串与==进行比较也是无效的。请改用strcmp()。在这里,我们测试了strcmp()在字符串相同时是否返回0

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