我在获取正确的输出时遇到问题,列表被弄乱了。
有人告诉我把while循环分成几个小部分会有帮助,但我似乎做不好。
问题:打印时,在某些列之间会弹出一个数字“1”,在代码的下面,它被替换为“-858993460”为什么会这样?
我的目标:“robot”“Termintortyp”“idnr”\n
又名:“终端”“T-800/T-1000”“1-100”
2.我还想添加一个错误检查:
如果出现错误->打印错误消息,则代码应继续,直到链接列表用完示例:在11到12行之间,它显示“FEL FEL FEL”或第16行“FEL FEL TERMINATOR T-1000 16”。如果在将txt.file读入链接列表时可以识别出问题,并以某种方式用错误消息替换“不正确的TERMINATOR”行可以解决我的问题,但我不知道如何正确地处理有什么建议吗?
感谢所有我能得到的帮助!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Link {
char robot[12];
char terminatortyp[10];
int idnr;
struct Link *next;
};
typedef struct Link Link;
Link *first = NULL;
int main(void) {
int antal = 0;
Link a;
FILE *tsin = fopen("textfil1R.txt", "r");
if (tsin == NULL) {
printf("Kunde inte läsa filen 'textfil.txt'.\n");
exit(EXIT_FAILURE);
}
Link *temp;
while (fgets(a.robot, sizeof a.robot, tsin) != NULL)
{
temp = malloc(sizeof(Link));
strcpy(temp->robot, a.robot);
fgets(a.terminatortyp, sizeof a.terminatortyp, tsin);
strcpy(temp->terminatortyp, a.terminatortyp);
fscanf(tsin, "%d", &a.idnr);
temp->idnr = a.idnr;
temp->next = first;
first = temp;
++antal;
}
fclose(tsin);
Link *p = first;
while (p != NULL)
{
//printf("%d\n", p->idnr);
printf("%s", p->robot);
printf("%s", p->terminatortyp);
printf("%d\n", p->idnr);
p = p->next;
}
printf("%d", antal);
getch();
return 0;
}
文本文件从以下位置读取:
TERMINATOR T-800 1
TERMINATOR T-1000 2
TERMINATOR T-800 3
TERMINATOR T-800 4
TERMINATOR T-1000 5
TERMINATOR T-800 6
TERMINATOR T-800 7
TERMINATOR T-800 8
TERMINATOR T-1000 9
TERMINATOR T-800 10
TORMONUTTUR T-800 101
TERMINATOR T-800 11
FEL FEL FEL
TERMINATOR T-1000 12
TERMINATOR T-800 13
TERMINATOR T-800 14
TERMINATOR T-800 15
TERMINATOR T-1000 16
TERMINATOR T-800 17
TERMINATOR T-800 18
TERMINATOR T-1000 19
TERMINATOR T-800 20
TERMINATOR T-800 21
TERMINATOR T-800 22
TERMINATOR T-1000 23
TERMINATOR T-800 24
TERMINATOR T-800 25
TERMINATOR T-1000 26
TERMINATOR T-800 27
TERMINATOR T-800 28
TERMINATOR T-800 29
TERMINATOR T-1000 30
TERMINATOR T-800 31
TERMINATOR T-800 32
TERMINATOR T-1000 33
TERMINATOR T-800 34
TERMINATOR T-800 35
TERMINATOR T-800 36
TERMINATOR T-1000 37
TERMINATOR T-800 38
TERMINATOR T-800 39
TERMINATOR T-1000 40
TERMINATOR T-800 41
TERMINATOR T-800 42
TERMINATOR T-800 43
TERMINATOR T-1000 44
TERMINATOR T-800 45
TERMINATOR T-800 46
TERMINATOR T-1000 47
TERMINATOR T-800 48
TERMINATOR T-800 49
TERMINATOR T-800 50
TERMINATOR T-1000 51
TERMINATOR T-800 52
TERMINATOR T-800 53
TERMINATOR T-1000 54
TERMINATOR T-800 55
TERMINATOR T-800 56
TERMINATOR T-800 57
TERMINATOR T-1000 58
TERMINATOR T-800 59
TERMINATOR T-800 60
TERMINATOR T-1000 61
TERMINATOR T-800 62
TERMINATOR T-800 63
TERMINATOR T-800 64
TERMINATOR T-1000 65
TERMINATOR T-800 66
TERMINATOR T-800 67
TERMINATOR T-1000 68
TERMINATOR T-800 69
TERMINATOR T-800 70
TERMINATOR T-800 71
TERMINATOR T-1000 72
TERMINATOR T-800 73
TERMINATOR T-800 74
TERMINATOR T-1000 75
TERMINATOR T-800 76
TERMINATOR T-800 77
TERMINATOR T-800 78
TERMINATOR T-1000 79
TERMINATOR T-800 80
TERMINATOR T-800 81
TERMINATOR T-1000 82
TERMINATOR T-800 83
TERMINATOR T-1001 84
TERMINATOR T-800 85
TERMINATOR T-1000 86
TERMINATOR T-800 87
TERMINATOR T-800 88
TERMINATOR T-1000 89
TERMINATOR T-800 90
TERMINATOR T-800 91
TERMINATOR T-800 92
TERMINATOR T-1000 93
TERMINATOR T-850 94
TERMINATOR T-800 95
TERMINATOR T-1000 96
TERMINATOR T-800 97
TERMINATOR T-800 98
TERMINATOR T-800 99
TERMINATOR T-1000 100
最佳答案
用fgets()
来读一行,而不是一个字。
char line[100];
while (fgets(line, sizeof line, tsin) != NULL) {
现在分析这条线使用
%n
保存扫描的偏移量-如果它达到了这个程度一定要限制成员可接受的字符的最大宽度。可以进行其他检查这会让你开始。 struct Link entry = { 0 }; // zero fill members
int n = 0;
int lead;
sscanf(line," %n%11s%9s%d %n",&lead, entry.robot, entry.terminatortyp, &entry.idnr, &n);
// All specifiers scanned and no extra junk?
if (n == 0 || line[n]) {
printf("Bad line <%s>\n", line);
continue;
}
if (lead > 0) {
printf("leading spaces <%s>\n", line);
continue;
}
根据需要对成员添加健全性检查。
if (entry.idnr < 1 || entry.idnr > 9999) {
printf("Bad index <%s>\n", line);
continue;
}
成功,现在分配
struct Link *node = malloc(sizeof *node);
if (node == NULL) {
printf("Out of memory at line <%s>\n", line);
break;
}
*node = entry;
node->next = first;
first = node;
}
有什么建议吗?
@伊玛努布,杜尔因努布
关于c - 从txt.file读取到链表,需要帮助来更正代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44811579/