我的代码如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *fp = fopen("text.txt", "r");
char c;
int d = 0;
char arr[2000];
do {
c = fgetc(fp);
d = d + 1;
if (c == '\n') {
arr[d] = ' ';
} else
arr[d] = c;
} while (c != EOF);
int z = strlen(arr);
arr[0]= '\0';
for (int i = 0;i < z; i++) {
arr[i] = arr[i +1];
}
fclose(fp);
return 0;
}
代码从文本文件中读取一个字符串,然后将它们转换为数组arr [2000](文本文件中有很多单词)。我想询问是否有人知道代码读取文本文件的方法,每个单词由空格分隔而不是字符。
所以例如,如果我有一个带字符串的数组arr:&#34;杰克是个男孩&#34;
arr [0]等于&#34;杰克&#34;不是&#34; J&#34;
p.s(删除索引0的for循环的原因是因为我一直得到一个&#34;(&#34;字符在数组的开头)
任何帮助都会非常感激。
答案 0 :(得分:6)
你说:
例如,如果我有一个带字符串的数组arr:
"Jack is a boy"
arr[0]
等于"Jack"
而不是"J"
为此,arr[0]
需要是指向空终止字符串的指针。这意味着,arr
必须是一个指针数组,而不是char
的数组。
char* arr[SOME_SIZE] = {0}; // Make SOME_SIZE large enough for your needs.
现在你必须找出存储从文件中读取的字符的位置。您可以使用Easiest way to get file's contents in C中使用的方法来读取文件的全部内容。假设你有代码来读取文件的内容,那就让我们:
char* fileContents = readFileContents("text.txt");
现在,fileContents
指向一个类似于:
+---+---+---+---+---+---+---+---+---+---+---+---+---+----+
| J | a | c | k | | i | s | | a | | b | o | y | \0 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+----+
现在,您需要遍历该数组并确保:
arr[0]
- arr[3]
指向数组中的正确位置。arr[0]
- arr[3]
指向以空字符结尾的字符串。arr[0] arr[1] arr[2] arr[3]
| | | |
v v v v
+---+---+---+---+----+---+---+----+---+----+---+---+---+----+
| J | a | c | k | \0 | i | s | \0 | a | \0 | b | o | y | \0 |
+---+---+---+---+----+---+---+----+---+-- -+---+---+---+----+
我希望能为您提供足够的信息来实现您所需的功能。
答案 1 :(得分:3)
您可以在一开始就获得额外的角色,因为您开始在arr[1]
填充数组。
此外,您可以使用fread
功能让生活变得更轻松:
size_t
fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
一次读入整个文本块。
然后,您可以随意将其分为单词。
现在,如果你还想要一个数组&#34;包含&#34;所有单独的单词,您应该查看array of pointers to char
或char *array[100]
(当然适当的大小)。 C不会自动处理字符串(正如您对问题的最后一点所期待的那样#34; arr [0]等于&#34; Jack&#34; not&#34; J&#34;& #34;
答案 2 :(得分:1)
您还需要查看三个额外的细微问题:
int c = 0; /* note: 'c' should be 'int' */
虽然char
适用于普通字符,但如果您尝试读取包含多字节字符的文件,则会遇到问题。
当您使用fopen
打开文件时,您需要在尝试从中读取文件之前检查该文件是否已打开。只需要一个简单的测试:
if (!fp) { /* validate file open succeeded */
fprintf (stderr, "error: file open failed 'text.txt'.\n");
return 1;
}
(注意:if (!fp)
只是if (fp == NULL)
)
接下来是您阅读c
的方式,将其分配给array
,然后测试c = EOF
。 c
为EOF
时会添加到数组中的内容?
在将c = EOF
分配给c
之前,您需要先测试arr
,如果是EOF
(-1 generally
,则不需要分配/* test c before you add it to the array */
while ((c = fgetc (fp)) != EOF)
{
if (c == '\n') {
arr[d++] = ' ';
} else
arr[d++] = c;
}
arr[d] = 0; /* null-terminate, note '\0' = 0 */
。快速更改循环将起作用:
yield from x