我正在使用C从文件中读取文本并将其存储在struct数组中。 但是在我使用printf打印之后,它的输出并不是我所期望的。
我的代码:
#include<stdio.h>
struct userINFO {
char id[6];
char name[20];
char lastName[20];
};
int main()
{
FILE *fdata;
struct userINFO allUser[3];
int i=0;
fdata = fopen("textdata.txt","r");
if (fdata == NULL)
{
printf("ERROR!");
return 0;
}
while (fscanf(fdata,"%s %s %s", allUser[i].id, allUser[i].name, allUser[i].lastName)!=EOF)
{
i++;
}
for (i = 0; i < 3 ; i++)
{
printf("ID: %s\n", allUser[i].id);
printf("Name: %s\n", allUser[i].name);
printf("LastName: %s\n", allUser[i].lastName);
}
fclose(fdata);
return 0;
}
文字档案:
001001
Firstname1
LastName1
601002
Firstname2
LastName2
601003
Firstname3
LastName3
输出
ID: 001001Firstname1
Name: Firstname1
LastName: LastName1
ID: 601002Firstname2
Name: Firstname2
LastName: LastName2
ID: 601003Firstname3
Name: Firstname3
LastName: LastName3
应该是什么:
ID: 001001
Name: Firstname1
LastName: LastName1
ID: 601002
Name: Firstname2
LastName: LastName2
ID: 601003
Name: Firstname3
LastName: LastName3
我尝试过很多改变fscanf的事情 - &gt; fgets,在printf中添加%6s,更改文本格式等。但它的输出仍然相同。 我应该在代码中更改什么才能使其正确显示?
答案 0 :(得分:1)
在结构中,您使用的是长度为6的字符串,但您需要考虑&#39; \ 0&#39;字符。因此,将id长度设为7将解决您的问题
final SyncAdapterType[] syncs = ContentResolver.getSyncAdapterTypes();
for (SyncAdapterType sync : syncs) {
Log.d(TAG, "found SyncAdapter: " + sync.accountType);
if (ContactsContract.AUTHORITY.equals(sync.authority)) {
Log.d(TAG, "SyncAdapter supports contacts: " + sync.accountType + " - supportsUploading=" + sync.supportsUploading());
}
}
答案 1 :(得分:0)
简单。变化:
struct userINFO {
char id[6];
char name[20];
char lastName[20];
};
到
struct userINFO {
char id[7];
char name[20];
char lastName[20];
};
在C中,\0
需要一个额外的字符来表示字符串的结尾。
C非常低级,因此printf
不知道为字符串保留了多少内存。 printf
唯一知道的就是它开始的地方。然后继续阅读,直至达到\0
。如果它在数组外部读取,则会导致未定义的行为。