gpt4 book ai didi

c - 使用 fgetc C 从文件读取字符串时出现问题(不使用 fscanf 等)

转载 作者:太空宇宙 更新时间:2023-11-04 08:26:21 24 4
gpt4 key购买 nike

我尝试只读取一个字符串,直到使用 fgetc 从文件中出现空格。我无法使用 fscanf 和其他 i/o 函数,因为我必须知道是否读取了换行符。函数调用 leerString(string,f) 应该更改字符串变量的内容,如果我将字符串打印到函数中它会起作用,但在外部它的值为 NONE。

当我尝试使用字符串变量更改返回值或传递“contador”变量时,我遇到了一些错误,例如 segmentation faults 和其他与 realloc 函数有关的错误像一个引用参数。这真让我抓狂。抱歉英语不好。

char leerString(char *string, FILE *archivo){
char caracter,caracter2 = 0;
char *nombre = malloc(sizeof(char)*30);//works like a buffer
int i = 0;
int j = 0;
while (1){
caracter = fgetc(archivo);
if ((caracter != 32) && (caracter != EOF) && (caracter != '\n')){
if (i < 30){
nombre[i] = caracter;
}
else{
nombre = realloc(nombre,30);
if (nombre != NULL){
nombre[i] = caracter;
}
else{
printf("Error de asignacion de memoria\n");
exit(-2);
}
}
i++;
}
else{
break;
}
}
char *nombre2=malloc(sizeof(char)*i);//allocating the real size of the str
for (j = 0; j<i; j++){ //cleaning the buffer
caracter2 = nombre[j];
nombre2[j] = caracter2;
}
strcpy(string,nombre2);
return caracter;
}

最佳答案

我可以看到你的代码有很多问题

  1. 您正在使用 realloc() 重新分配相同大小的缓冲区;它用于调整缓冲区大小。
  2. 您的 caracter 变量的类型为 char,但 fgetc() 返回 int
  3. 您为目标字符串分配内存,然后您不必要地使用 realloc() 如上所述,然后您再次分配空间,然后执行此操作

    for (j = 0; j<i; j++){ //cleaning the buffer
    caracter2 = nombre[j];
    nombre2[j] = caracter2;
    }

    什么都不做,

    memcpy(nombre2, nombre, i);
  4. 您没有为终止 nul 字节分配空间,因此 strcpy() 将在您的代码中失败,从而可能导致段错误或其他任何问题,因为它是未定义的行为。

您还应该确保 string 有足够的空间将字符复制到其中,或者只返回指向函数中 malloc()ed 字符串的指针,它返回 char 我不知道这是否有用,因为您没有发布足够的代码来说明。

更好的解决方案是

char *
leerString(char *string, size_t size, FILE *archivo)
{
int chr;
size_t i;

i = 0;
chr = fgetc(archivo);
while ((chr != EOF) && (isspace(chr) == 0) && (i < size - 1))
{
string[i++] = chr;
chr = fgetc(archivo);
}
if (i == 0)
return NULL;
string[i] = '\0'; /* ensure it's `nul' terminated */

return string;
}

您可以按如下方式使用

char string[100];

if (leerString(string, sizeof(string), archivo) != NULL)
printf("%s\n", string);

关于c - 使用 fgetc C 从文件读取字符串时出现问题(不使用 fscanf 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30281829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com