我创建了一个包含2个char []和一个int的结构。我创建了一个这个结构的数组,并scanf
编了几个输入来将数据存储到数组中。然后我使用fprintf
将此数据写入文件。但是当我打开文件时,我会在每个新记录之前得到û
。 Idk为什么会这样。
以下是相关代码:
FILE *outputFile=fopen("1021.txt","ab");
int tickets=0,i=1;
struct air s[30];
printf("\nEnter Number of tickets:");
scanf("%d",&tickets);
for (i=1;i<=tickets;i++)
{
printf("\nEnter the name\t");
scanf("%s",&s[i].name);
printf("\nEnter the phone number\t");
scanf("%s",&s[i].phoneNo);
printf("\n Enter the address\t");
scanf("%s",&s[i].address);
printf("Your ticket is confirmed\t");
getch();
}
for (i=0;i<=tickets;i++)
{
printf("%s", s[i].name);
printf("%s", s[i].phoneNo);
printf("%s", s[i].address);
fprintf(outputFile,"%s",s[i].name);
fprintf(outputFile,"%s",s[i].phoneNo);
fprintf(outputFile,"%s",s[i].address);
}
这是我在文件中得到的内容: ûdalla03332228458dallaÈfsÇûÿÿÿÿàrancho03312041265dallabancho
那些不寻常的角色来自哪里?
答案 0 :(得分:4)
您的输入循环是
for (i=1;i<=tickets;i++)
但输出循环是
for (i=0;i<=tickets;i++)
因此,您正在从元素[0]
向文件写入数据,而您没有输入数据。这就是为什么它是垃圾。
在C中,数组是从[0]
索引的,并且这些循环都不对。请将它们都更改为
for (i = 0; i < tickets; i++)
代码中还存在其他问题,但这解决了直接的&#34;未初始化的数据&#34;问题
编辑:其他一些问题。
您在&#34;二进制&#34;中打开了文件模式,但您将其用作文本文件。我相信这种区别只在Windows中是必要的。
FILE *outputFile=fopen("1021.txt", "at"); // change to "t"
传递给scanf
的字符串地址不应包含&
地址(与int
不同)。只需传递数组 - 它就会衰减到所需的指针。
scanf("%s", s[i].name); // removed `&`
由于您没有写任何换行文件来标记您的字符串数据,当您重新读取数据时,您将不知道每个结束的位置和下一个开始的位置。例如,像这样添加newline
fprintf(outputFile, "%s\n", s[i].name); // added \n
你说一个成员是int
可能是电话号码,但你输入的是一个字符串。然而,将电话号码存储为整数是一个坏主意,因为a)可能包含诸如'+'
或b)之类的字符可能以前导0
开头,并且当您存储为int
时会丢失phoneNo
。因此,将结构成员char
更改为足够长度的scanf
数组。
%s
格式说明符newline
将在它遇到的第一个空格处停止,因此输入语句将更好,只有在找到int res = scanf("%29[^\n]", s[i].name);
或点击时才会停止长度限制:
[30]
其中定义的数组长度为fgets()
(您没有显示结构)。或者,您可以研究使用fopen
。
最后,您应该检查您正在调用的函数的返回值,以查看它们是否成功。 scanf
将告诉您文件是否正确打开。 fgets
会告诉您扫描的条目数量,public String findWord(String string, String word){
String[] text = string.split(" *");
for(int i=0; i<text.length; i++){
if(text[i].equals(word)){
return text[i];
}
}
return "Not found";
}
会告诉您它是否也是成功的。