我在弄清楚为什么“myWord”数组中的元素正在消失时遇到了一些麻烦。 “myWord”和“myLines”都是我的.h文件中的全局变量。问题是,如果我将readWords()和printWords()函数结合起来,那么它就可以了。那么我用“myWord”来解决这个问题是怎么回事?
这是我的输出:
> Line: 0 (null)
> Line: 1 (null)
> Line: 2 ▒Á#
> Line: 3 __libc_start_main
> Line: 4 (null) Segmentation fault (core dumped)
.c文件片段
void ReadWords(struct assem item) //reads words into array
{
char *word;
for(int s = 0; s < item.counter; s++)
{
item.word = strtok(item.myLines[s], " ");
item.myWord[s] = item.word;
}
}
void printWords(struct assem item)
{
for(int s = 0; s < item.counter; s++)
{
printf("Line: %i %s\n", s , item.myWord[s]);
}
}
.h文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct assem
{
char myString[101]; //buffer
char *myLines[20]; //this will store the lines from a text file..up to 20 lines
char *myWord[20];
char *word;
int counter; //counter for number of lines
//printing stuff...prints file directly from whats STORED IN THE ARRAY
};
int readFile(FILE *FileToBeRead, struct assem *item); //takes in the file that needs to be read and splits it into lines
void ReadWords(struct assem item); //stores the first word of each line in an array for evaluation
void printFile(struct assem item); //prints some stuff
int firstCheck(struct assem item);
void printWords(struct assem item); //checks the first character if its instruction, label, or comment
答案 0 :(得分:3)
您的函数ReadWords
应该用数据填充结构。它的签名是:
void ReadWords(struct assem item);
这里,item
是结构的本地副本,因为结构是按值传递的。函数返回后,对本地结构的所有更改都将丢失,并且原始结构将不会初始化。 (因此,您在打印时看到的垃圾值。)
您可以通过将指针传递给结构来解决此问题:
void ReadWords(struct assem *item)
{
item->word = ...;
}
并称之为:
struct assem item;
ReadWords(&item);
另一种可能性是让函数返回一个结构:
struct assem ReadWords()
{
struct assem item;
item.word = ...;
// ...
return item;
}
并将其称为:
struct assem item = ReadWord();
将结构按值传递给打印功能是可以的,因为您在打印时不会修改原始结构。如果结构很大,您也可以考虑将其作为const struct assem *
const指针传递,以避免复制。 (返回一个结构有同样的问题,所以更喜欢指针。)
最后,我不认为您需要使用结构成员进行标记。解析后的item.word
的含义应该是什么?