字符串让我发疯。这就像没有buit-in功能是有用的。
我想做的就是这个。我有这个文件f:
1
I like fries
2
Do you like fries?
3
I like trains.
我怎样才能读完整个句子"我喜欢薯条"从文件?到目前为止,没有什么对我有用。我不知道这句话有多长,我正在阅读/保存句子的变量是char *Blaa;
我有这个
typedef struct Student
{
int nrcrt;
char *name;
} Student;
Student *S;
void Readstuff()
{
FILE *f;
int i;
f = fopen("students.txt","r");
if (!f)
{
perror("can't open file.\n"); exit(EXIT_FAILURE);
}
char line[4096];
for(i=0;i<N;i++)
{
fscanf(f,"%d",&S[i].nrcrt);
printf("%d\n",S[i].nrcrt);
while (fgets(line,sizeof(line),f) != 0)
{
strcpy(S[i].name,line);
}
}
close(f);
}
我可以读入S [i] .nrcrt,但如果我想读取一个字符串并将其放入S [i] .name中,整个宇宙就会爆炸。我一直在分段错误。我试图在变量line
中读取一行,然后将其复制到S[i].name
但没有。
为了争论,我们假装学生的名字可以是#34;我喜欢薯条&#34;。我不想让这个问题过于复杂,所以这就是为什么我没有真正说出我需要的东西。
答案 0 :(得分:0)
你有:
typedef struct Student
{
int nrcrt;
char *name;
} Student;
Student *S;
您不会显示分配Student
结构数组或存储名称空间的任何代码。在C中,您始终必须确保指针指向某些内容 - 并且使用您已显示的数据结构,您需要管理Students
的动态数组,并且每个{ {1}},您必须动态分配其名称。通过动态内存管理,您还必须确保释放已分配的内存。
分配名称的最简单方法是使用POSIX函数strdup()
:
Student
关于在C中管理动态结构数组,您可以找到关于SO的无数其他问题。或者您可以通过使用以下方式完全解决问题:
S[i].name = strdup(line);
除非您有理由为阵列进行动态内存分配,否则请使用它。如果您更改了结构,也可以避免Student S[MAX_STUDENTS];
:
strdup()
有各种选择。你在一行上显示句子;这很容易。句子可以分布在多行文本中吗?
听起来您的一个问题是,您尚未对typedef struct Student
{
int nrcrt;
char name[MAX_NAME_LEN];
} Student;
指出任何数据。
您可以使用Blaa
:
fgets()
如果您需要处理多行句子,那么您需要准备好从多行构建句子。你的句子长度有上限吗?您不太可能发现许多使用超过4 KiB数据的句子,因此您可能只是将句子的连续行读入单个char line[4096];
while (fgets(line, sizeof(line), stdin) != 0)
{
…process line (sentence)…
}
缓冲区。
line
如果你不能在句子大小上设置一个合理的上限,那么你将不得不逐句建立句子,将行读入char line[4096];
char *buffer = line;
size_t buflen = sizeof(line);
while (fgets(buffer, buflen, stdin) != 0)
{
if (isdigit((unsigned char)buffer[0]))
{
*buffer = '\0';
…process sentence in line…
buffer = line;
buflen = sizeof(line);
}
else
{
size_t newline = strlen(buffer);
buffer += newline;
buflen -= newline;
}
}
if (buffer != line)
{
…process sentence in line…
}
然后将其复制到一个动态增长的数组中(创建使用line
和malloc()
,最终由realloc()
发布。