Editing Array of Struct in another Function
As I may or may not have stated in a previous question, I am a newbie to C Programming and only have experience previously with Java, so I am fairly incompetent at using Structs and Pointers and may not have grasped these concepts well on the first time.
So I was playing with C and when I tried out the following program below:
#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 nothingn");
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("%st%dn", friendArr[i].name, friendArr[i].number);
}
}
}
void addfriend (friend * friendArr, int index) {
char buf[buf_sz];
int number;
printf("Add a friend's namen");
fgets(buf, buf_sz-1, stdin);
sscanf(buf, " %s", friendArr[index].name);
printf("Add his numbern");
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 removen");
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, "");
}
}
}
My Output was given as:
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
Which is basically a bunch of strange numbers, which I do not get the meaning of.
The desired output would be a message to print the question add a user's name and number if 1 was pressed, and delete a user if 2 was pressed, then print all the users.
I believe the problem here is my passing of array to struct, but I am not sure.
I have searched Stack Overflow everywhere for possible places I have went wrong, but I could not find anything that helped.
Can you friendly people point out where I went wrong?
c arrays struct
|
show 5 more comments
As I may or may not have stated in a previous question, I am a newbie to C Programming and only have experience previously with Java, so I am fairly incompetent at using Structs and Pointers and may not have grasped these concepts well on the first time.
So I was playing with C and when I tried out the following program below:
#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 nothingn");
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("%st%dn", friendArr[i].name, friendArr[i].number);
}
}
}
void addfriend (friend * friendArr, int index) {
char buf[buf_sz];
int number;
printf("Add a friend's namen");
fgets(buf, buf_sz-1, stdin);
sscanf(buf, " %s", friendArr[index].name);
printf("Add his numbern");
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 removen");
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, "");
}
}
}
My Output was given as:
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
Which is basically a bunch of strange numbers, which I do not get the meaning of.
The desired output would be a message to print the question add a user's name and number if 1 was pressed, and delete a user if 2 was pressed, then print all the users.
I believe the problem here is my passing of array to struct, but I am not sure.
I have searched Stack Overflow everywhere for possible places I have went wrong, but I could not find anything that helped.
Can you friendly people point out where I went wrong?
c arrays struct
1
You never initializeindex
, soindex++;
causes undefined behavior.
– Barmar
Nov 20 at 22:18
You cannot compare strings with==
in C. The best thing you can do at this point is to 1) turn on all warnings in your compiler and set them to be treated as errors, and 2) learn how to use a debugger.
– Groo
Nov 20 at 22:19
(troll == 1) && (troll == 2)
can never be true. How can a variable be equal to two different numbers at the same time? I think you meant||
.
– Barmar
Nov 20 at 22:19
I believe that I summarised index as an int. Are you talking about the index in the main function?
– Ervin Tan
Nov 20 at 22:20
for (int i = 0; i < 50; i++)
is printing more friends than have actually been added.
– Barmar
Nov 20 at 22:20
|
show 5 more comments
As I may or may not have stated in a previous question, I am a newbie to C Programming and only have experience previously with Java, so I am fairly incompetent at using Structs and Pointers and may not have grasped these concepts well on the first time.
So I was playing with C and when I tried out the following program below:
#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 nothingn");
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("%st%dn", friendArr[i].name, friendArr[i].number);
}
}
}
void addfriend (friend * friendArr, int index) {
char buf[buf_sz];
int number;
printf("Add a friend's namen");
fgets(buf, buf_sz-1, stdin);
sscanf(buf, " %s", friendArr[index].name);
printf("Add his numbern");
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 removen");
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, "");
}
}
}
My Output was given as:
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
Which is basically a bunch of strange numbers, which I do not get the meaning of.
The desired output would be a message to print the question add a user's name and number if 1 was pressed, and delete a user if 2 was pressed, then print all the users.
I believe the problem here is my passing of array to struct, but I am not sure.
I have searched Stack Overflow everywhere for possible places I have went wrong, but I could not find anything that helped.
Can you friendly people point out where I went wrong?
c arrays struct
As I may or may not have stated in a previous question, I am a newbie to C Programming and only have experience previously with Java, so I am fairly incompetent at using Structs and Pointers and may not have grasped these concepts well on the first time.
So I was playing with C and when I tried out the following program below:
#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 nothingn");
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("%st%dn", friendArr[i].name, friendArr[i].number);
}
}
}
void addfriend (friend * friendArr, int index) {
char buf[buf_sz];
int number;
printf("Add a friend's namen");
fgets(buf, buf_sz-1, stdin);
sscanf(buf, " %s", friendArr[index].name);
printf("Add his numbern");
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 removen");
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, "");
}
}
}
My Output was given as:
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
Which is basically a bunch of strange numbers, which I do not get the meaning of.
The desired output would be a message to print the question add a user's name and number if 1 was pressed, and delete a user if 2 was pressed, then print all the users.
I believe the problem here is my passing of array to struct, but I am not sure.
I have searched Stack Overflow everywhere for possible places I have went wrong, but I could not find anything that helped.
Can you friendly people point out where I went wrong?
c arrays struct
c arrays struct
edited Nov 20 at 22:17
Barmar
418k34243344
418k34243344
asked Nov 20 at 22:15
Ervin Tan
11
11
1
You never initializeindex
, soindex++;
causes undefined behavior.
– Barmar
Nov 20 at 22:18
You cannot compare strings with==
in C. The best thing you can do at this point is to 1) turn on all warnings in your compiler and set them to be treated as errors, and 2) learn how to use a debugger.
– Groo
Nov 20 at 22:19
(troll == 1) && (troll == 2)
can never be true. How can a variable be equal to two different numbers at the same time? I think you meant||
.
– Barmar
Nov 20 at 22:19
I believe that I summarised index as an int. Are you talking about the index in the main function?
– Ervin Tan
Nov 20 at 22:20
for (int i = 0; i < 50; i++)
is printing more friends than have actually been added.
– Barmar
Nov 20 at 22:20
|
show 5 more comments
1
You never initializeindex
, soindex++;
causes undefined behavior.
– Barmar
Nov 20 at 22:18
You cannot compare strings with==
in C. The best thing you can do at this point is to 1) turn on all warnings in your compiler and set them to be treated as errors, and 2) learn how to use a debugger.
– Groo
Nov 20 at 22:19
(troll == 1) && (troll == 2)
can never be true. How can a variable be equal to two different numbers at the same time? I think you meant||
.
– Barmar
Nov 20 at 22:19
I believe that I summarised index as an int. Are you talking about the index in the main function?
– Ervin Tan
Nov 20 at 22:20
for (int i = 0; i < 50; i++)
is printing more friends than have actually been added.
– Barmar
Nov 20 at 22:20
1
1
You never initialize
index
, so index++;
causes undefined behavior.– Barmar
Nov 20 at 22:18
You never initialize
index
, so index++;
causes undefined behavior.– Barmar
Nov 20 at 22:18
You cannot compare strings with
==
in C. The best thing you can do at this point is to 1) turn on all warnings in your compiler and set them to be treated as errors, and 2) learn how to use a debugger.– Groo
Nov 20 at 22:19
You cannot compare strings with
==
in C. The best thing you can do at this point is to 1) turn on all warnings in your compiler and set them to be treated as errors, and 2) learn how to use a debugger.– Groo
Nov 20 at 22:19
(troll == 1) && (troll == 2)
can never be true. How can a variable be equal to two different numbers at the same time? I think you meant ||
.– Barmar
Nov 20 at 22:19
(troll == 1) && (troll == 2)
can never be true. How can a variable be equal to two different numbers at the same time? I think you meant ||
.– Barmar
Nov 20 at 22:19
I believe that I summarised index as an int. Are you talking about the index in the main function?
– Ervin Tan
Nov 20 at 22:20
I believe that I summarised index as an int. Are you talking about the index in the main function?
– Ervin Tan
Nov 20 at 22:20
for (int i = 0; i < 50; i++)
is printing more friends than have actually been added.– Barmar
Nov 20 at 22:20
for (int i = 0; i < 50; i++)
is printing more friends than have actually been added.– Barmar
Nov 20 at 22:20
|
show 5 more comments
1 Answer
1
active
oldest
votes
You need to initialise your variables:
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] = ''; // <<-- AND THE NAME
When you print out the friends list, the members names cannot be compared to NULL
, since they are not pointers. (well they can be compared, but it does not make sense). It would be better, once the data-set is initialised to blank, to check to see if there's a name set.
for (int i = 0; i < 50; i++)
{
if (friendArr[i].name[0] != '')
{
printf("%st%dn", friendArr[i].name, friendArr[i].number);
}
}
Also as @Groo points out, it's not valid to compare C strings with ==
. Use strcmp()
instead. Here we test that strcmp()
returns 0
when the strings are identical.
for (int i = 0; i < 50; i++)
{
if (strcmp(friendArr[i].name, name) == 0)
{
strcpy(friendArr[i].name, "");
}
}
Thank you so much.
– Ervin Tan
Nov 20 at 22:30
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53402414%2fediting-array-of-struct-in-another-function%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You need to initialise your variables:
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] = ''; // <<-- AND THE NAME
When you print out the friends list, the members names cannot be compared to NULL
, since they are not pointers. (well they can be compared, but it does not make sense). It would be better, once the data-set is initialised to blank, to check to see if there's a name set.
for (int i = 0; i < 50; i++)
{
if (friendArr[i].name[0] != '')
{
printf("%st%dn", friendArr[i].name, friendArr[i].number);
}
}
Also as @Groo points out, it's not valid to compare C strings with ==
. Use strcmp()
instead. Here we test that strcmp()
returns 0
when the strings are identical.
for (int i = 0; i < 50; i++)
{
if (strcmp(friendArr[i].name, name) == 0)
{
strcpy(friendArr[i].name, "");
}
}
Thank you so much.
– Ervin Tan
Nov 20 at 22:30
add a comment |
You need to initialise your variables:
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] = ''; // <<-- AND THE NAME
When you print out the friends list, the members names cannot be compared to NULL
, since they are not pointers. (well they can be compared, but it does not make sense). It would be better, once the data-set is initialised to blank, to check to see if there's a name set.
for (int i = 0; i < 50; i++)
{
if (friendArr[i].name[0] != '')
{
printf("%st%dn", friendArr[i].name, friendArr[i].number);
}
}
Also as @Groo points out, it's not valid to compare C strings with ==
. Use strcmp()
instead. Here we test that strcmp()
returns 0
when the strings are identical.
for (int i = 0; i < 50; i++)
{
if (strcmp(friendArr[i].name, name) == 0)
{
strcpy(friendArr[i].name, "");
}
}
Thank you so much.
– Ervin Tan
Nov 20 at 22:30
add a comment |
You need to initialise your variables:
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] = ''; // <<-- AND THE NAME
When you print out the friends list, the members names cannot be compared to NULL
, since they are not pointers. (well they can be compared, but it does not make sense). It would be better, once the data-set is initialised to blank, to check to see if there's a name set.
for (int i = 0; i < 50; i++)
{
if (friendArr[i].name[0] != '')
{
printf("%st%dn", friendArr[i].name, friendArr[i].number);
}
}
Also as @Groo points out, it's not valid to compare C strings with ==
. Use strcmp()
instead. Here we test that strcmp()
returns 0
when the strings are identical.
for (int i = 0; i < 50; i++)
{
if (strcmp(friendArr[i].name, name) == 0)
{
strcpy(friendArr[i].name, "");
}
}
You need to initialise your variables:
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] = ''; // <<-- AND THE NAME
When you print out the friends list, the members names cannot be compared to NULL
, since they are not pointers. (well they can be compared, but it does not make sense). It would be better, once the data-set is initialised to blank, to check to see if there's a name set.
for (int i = 0; i < 50; i++)
{
if (friendArr[i].name[0] != '')
{
printf("%st%dn", friendArr[i].name, friendArr[i].number);
}
}
Also as @Groo points out, it's not valid to compare C strings with ==
. Use strcmp()
instead. Here we test that strcmp()
returns 0
when the strings are identical.
for (int i = 0; i < 50; i++)
{
if (strcmp(friendArr[i].name, name) == 0)
{
strcpy(friendArr[i].name, "");
}
}
edited Nov 20 at 22:30
answered Nov 20 at 22:27
Kingsley
2,27711023
2,27711023
Thank you so much.
– Ervin Tan
Nov 20 at 22:30
add a comment |
Thank you so much.
– Ervin Tan
Nov 20 at 22:30
Thank you so much.
– Ervin Tan
Nov 20 at 22:30
Thank you so much.
– Ervin Tan
Nov 20 at 22:30
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53402414%2fediting-array-of-struct-in-another-function%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
You never initialize
index
, soindex++;
causes undefined behavior.– Barmar
Nov 20 at 22:18
You cannot compare strings with
==
in C. The best thing you can do at this point is to 1) turn on all warnings in your compiler and set them to be treated as errors, and 2) learn how to use a debugger.– Groo
Nov 20 at 22:19
(troll == 1) && (troll == 2)
can never be true. How can a variable be equal to two different numbers at the same time? I think you meant||
.– Barmar
Nov 20 at 22:19
I believe that I summarised index as an int. Are you talking about the index in the main function?
– Ervin Tan
Nov 20 at 22:20
for (int i = 0; i < 50; i++)
is printing more friends than have actually been added.– Barmar
Nov 20 at 22:20