C 当fputs直接用于在文件中写入字符数组时,会存储不同格式的文本

C 当fputs直接用于在文件中写入字符数组时,会存储不同格式的文本,c,C,当我使用fputs()将字符数组直接存储在文件中时,它将其存储在文件中: ÈLwìþ( 为什么会这样 #include <stdio.h> int main() { FILE *p; p=fopen("pa.txt","w+"); char name[100]; printf("Enter a string :"); fputs(name,p); fclose(p); getchar(); return 0; }

当我使用
fputs()
将字符数组直接存储在文件中时,它将其存储在文件中:

ÈLwìþ( 
为什么会这样

#include <stdio.h>

int main()
{
    FILE *p;
    p=fopen("pa.txt","w+");
    char name[100];
    printf("Enter a string :");
    fputs(name,p);
    fclose(p);
    getchar();
    return 0;
}
#包括
int main()
{
文件*p;
p=fopen(“pa.txt”,“w+”);
字符名[100];
printf(“输入字符串:”);
FPUT(名称,p);
fclose(p);
getchar();
返回0;
}
当我使用
scanf()
gets()
以名称输入时,将存储正确的文本,但当直接使用
fputs()
时,将以不寻常的格式存储。 为什么会发生这种情况

当我使用scanf()或get()以名称输入时,正确的文本是 已存储,但直接使用fputs()时,它以不寻常的格式存储。 为什么会发生这种情况

根据C标准,访问未初始化变量
p
作为其值是不确定的。无法解释为什么会发生这种情况。别那么做

6.7.9初始化(C11草稿)

如果未初始化具有自动存储持续时间的对象 显然,它的值是不确定的

不确定定义为:

3.19.2不确定
值可以是未指定的值,也可以是陷阱表示

请注意,函数
gets()
已从最新的C标准(C11)中删除,并且由于其缓冲区溢出问题,它从来都不是安全的

当我使用
scanf()
gets()
以名称输入时,会存储正确的文本,但当直接使用
fputs()
时,会以异常格式存储。为什么会发生这种情况

在使用
fputs
写出数据之前,您没有从
stdin
读取数据

使用:

然后:

fputs(name, p);
您已打开字符数组,但尚未使用它。分析你将理解的代码

#include <stdio.h>
int main()
{
    char name[100];

    FILE *p;

    p=fopen("pa.txt","w+");

    if(!p) {
        perror("Error writing");
        return -1;
    }

    printf("Enter a string :");
    scanf("%s",name);
    fputs(name,p);

    fclose(p);

    return 0;
}
#包括
int main()
{
字符名[100];
文件*p;
p=fopen(“pa.txt”,“w+”);
如果(!p){
perror(“错误写入”);
返回-1;
}
printf(“输入字符串:”);
scanf(“%s”,名称);
FPUT(名称,p);
fclose(p);
返回0;
}

您的意思是“为什么访问未初始化的变量会导致意外后果”?您是否将
fgets()
fputs()
混淆?@Mr.Llama,是的,我无法理解它。@chux不,我没有混淆fgets()和fputs()。另请参见我也不明白,当我编译和运行此代码时,它会要求输入,当我不使用scanf()或get()时,它会接受输入。@ameyCU,输入由
getchar()
处理,它只读取一个字符。其余部分将被丢弃,因为程序在此之后终止。
#include <stdio.h>
int main()
{
    char name[100];

    FILE *p;

    p=fopen("pa.txt","w+");

    if(!p) {
        perror("Error writing");
        return -1;
    }

    printf("Enter a string :");
    scanf("%s",name);
    fputs(name,p);

    fclose(p);

    return 0;
}