C 为什么我的代码中有零打印?
嘿,伙计们,我正在尝试在指向我的结构的指针数组中进行结构操纵。我可以很好地添加值,但我的行之间始终显示0。我的文件只有三行长,后面是一个整数和一个字符串。一切似乎都解析正确,但我的文本中不断出现零 我的文件看起来像这样,以防你想知道 421 0123456789ABCDEF0123456789ABCDE00123456789ABCDEF0123456789ABCDEF0123456789ABCDE0 422 0000000000000000000000000000000000000000000000000000000000 423 1111111111111111111111111111111111111111111111111111111111111111111 当我在我的表中读取数据后,试图打印输出时,它看起来是这样的 421 0123456789ABCDEF0123456789ABCDE00123456789ABCDEF0123456789ABCDEF0123456789ABCDE0 0 422 0000000000000000000000000000000000000000000000000000000000 0 423 1111111111111111111111111111111111111111111111111111111111111111111C 为什么我的代码中有零打印?,c,io,printf,fgets,C,Io,Printf,Fgets,嘿,伙计们,我正在尝试在指向我的结构的指针数组中进行结构操纵。我可以很好地添加值,但我的行之间始终显示0。我的文件只有三行长,后面是一个整数和一个字符串。一切似乎都解析正确,但我的文本中不断出现零 我的文件看起来像这样,以防你想知道 421 0123456789ABCDEF0123456789ABCDE00123456789ABCDEF0123456789ABCDEF0123456789ABCDE0 422 00000000000000000000000000000000000000000000
我不认为它来自字符串的后面,因为每个键的长度都是合适的。关于它可能来自哪里有什么建议吗?任何帮助都将不胜感激。主要问题是您使用strcpyk->cryptkeys,key;其中键不是以null结尾的。只写入前64个元素,而不初始化最后一个元素
但也有一些一般性的问题,例如,您正在泄漏内存,因为您在循环中调用malloc而没有释放内存。您完全可以不使用malloc编写程序,并且您正在不必要地将整个文件读入内存。函数fgets将以字符串行形式读取行,直到读取最大行字符或到达新行为止。 因此,您可以首先为行字符串分配足够的内存来读取行。在这种情况下,它是最大线
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <string.h>
#define MAX_KEYS 26
#define MAX_UID 4
struct Key {
int keynum;
int id;
char cryptkeys[65];
};
int main(int argc, char ** argv) {
int MAX_LINE = 69;
struct Key *table = malloc(MAX_UID * sizeof(struct Key));
FILE *fileopen = fopen(filename, "r");
char *a[8];
int size = 0;
char *e;
char *string = NULL;
//reading the file
if(fileopen) {
while((e = fgets( line, MAX_LINE, fileopen )) != NULL) {
printf(e);
a[size] = strdup(e);
size++;
}
}
else {
printf("File does not exist\n");
exit(0);
}
for(int i = 0; i < size; i++ ) {
//printf("%s", a[i]); //no zero showing up
}
//parsing the id and the keys
char id[3];
char key[65];
int ids;
int idnum;
for(int i = 0; i < size-1; i++) {
struct Key *k = (struct Key*)malloc(sizeof(struct Key));
string = a[i];
//set the ID
for(int ix = 0; ix < 3; ix++) {
id[ix] = string[ix];
}
//printf("%s", id); No zero inbetween ID
//set the Keys
for(int j = 4; j < 68; j++) {
key[j-4] = string[j];
}
ids = strtol(string, &id2, 10);
//printf("Id is %d", ids); //zero shows up here
//printf(" ");
k->id = ids;
strcpy(k->cryptkeys, key);
k->keynum++;
table[i] = *k;
idnum++;
}
for(int i = 0; i < 5; i++) {
printf("%d", table[i].id);
printf(" ");
printf("%s", table[i].cryptkeys);
printf("\n");
}
return 0;
}
我认为这不是你的问题,但是这个:char*e;/*…*/printfe;如果e指向的字符串恰好包含任何%个字符,则可能存在危险。使用printf%s,e;您的代码甚至没有编译。fgets中的行是什么?另外,现在只需将a声明为char a[8][MAX_line],将表声明为struct Key table[MAX_UID]。避免结巴。我这样说是因为您的代码在I/O和内存分配/释放方面都有问题。谢谢Keith,我实际上只是用它来测试和发现错误,我不打算再使用它了。为什么使用strdup是件坏事?你是对的,字符值在最后填充。非常感谢。谢谢,我看到了,并立即用“\0”字符修复了它。我试着熟悉一下malloc,如果没有它,使用起来会容易得多。
char line[MAX_LINE];
char *a[8];
while((e = fgets( line, MAX_LINE, fileopen )) != NULL)
{
printf(line);
a[size] = strdup(line);
size++;
}