我的问题是,我需要从文件中读取字符串。文件的例子。
例子1
例句号xd 595 xd 49 lol
但我只需要读取字符串部分,而不是数字。我想我必须使用 fscanf()
与 %s
但让我知道你们对它的看法.我的问题开始的部分是如何读取字符串(它是未知长度),使用 malloc()
, realloc()
? 我自己试了一下,但是失败了(我的解决方案在我的帖子底部).然后我需要在屏幕上显示结果。
P.S. 我必须使用 malloc()/calloc()
, realloc()
<--它必须是动态分配的字符串:) (char *
)
代码我已经试过了。
int wordSize = 2;
char *word = (char *)malloc(wordSize*sizeof(char));
char ch;
FILE* InputWords = NULL;
InputWords = fopen(ListOfWords,"r"); /* variable ListOfWords contains name of the file */
if (InputWords == NULL)
{
printf("Error while opening the file.\n");
return 0;
}
int index = 0;
while((ch = fgetc(InputWords)) != -1)
{
if(ch == ' ')
{
printf("%s\n", word);
wordSize = 2;
index = 0;
free(word);
char* word = (char *)malloc(wordSize*sizeof(char));
}
else
{
wordSize++;
word = (char *)realloc(word, wordSize*sizeof(char));
strcpy(word,ch);
index++;
}
}
fclose(InputWords);
对于你的代码,你有一些东西需要改进。
fgetc
返回 int
无型 char
. 那就换吧 char ch
到 int ch
;strcpy(word,ch);
你试图复制字符(ch
)到字符指针(word
).malloc
或 realloc
函数。我是否要投掷malloc的结果?.为了解决你的问题,我建议你使用 strtok
函数将字符串用空格分割,然后测试每个字是否是数字。如果字不是数字,可以使用 strcat
以将该词连缀到旧句中。
完整的代码。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int is_number(char *str) {
if (strlen(str) == 0)
return -1;
for(int i =0; (i < strlen(str)) && (str[i] != '\n') ; i++) {
if(!isdigit(str[i]))
return -1;
}
return 1;
}
int main()
{
FILE *fp = fopen("input.txt", "r");
char line[256];
if(!fp) return -1;
char **sentence;
int i = 0;
sentence = malloc(sizeof(char *));
if(!sentence) return -1;
while(fgets(line, 256, fp)) {
char * token = strtok(line, " ");
size_t len = 0;
sentence = realloc(sentence, sizeof(char *) * (i+1));
if(!sentence) return -1;
while(token != NULL) {
if (is_number(token) != 1) {
sentence[i] = realloc(sentence[i], len + 2 + strlen(token)); // +2 because 1 for null character and 1 for space character
if (!sentence[i]) {
printf("cannot realloc\n");
return -1;
}
strcat(strcat(sentence[i], " "), token);
len = strlen(sentence[i]);
}
token = strtok(NULL, " ");
}
if(len > 0)
i++;
}
for(int j = 0; j < i; j++) {
printf("line[%d]: %s", j, sentence[j]);
}
for(int j = 0; j < i; j++) {
free(sentence[j]);
}
free(sentence);
fclose(fp);
return 0;
}
输入和输出。
$cat input.txt
Example 1 sentence
Example sentence number xd 595 xd 49 lol
./test
line[0]: Example sentence
line[1]: Example sentence number xd xd lol