gpt4 book ai didi

c - 同一程序的不同启动过程中的多个(随机选择)输出。 fscanf'ing 时添加的随机字符

转载 作者:行者123 更新时间:2023-11-30 14:44:23 24 4
gpt4 key购买 nike

简单程序:通过 fscanf 从 .txt 文件中读取名字和姓氏 (John Smith),添加空格,在控制台中打印名字(就像在 .txt 中写入的一样)。

如果通过Win10编译并运行

Microsoft (R) C/C++ Optimizing Compiler Version 19.14.26433 for x86

以下代码不会在不同的 .exe 启动中为相同的输入生成相同的输出(无需重新编译)。对于每个输入,它似乎都有多个可用的输出,程序在这些输出之间随机决定。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char input_file_name[255];
FILE * input_file;
char name[255];
input_file = fopen ("a.txt","r");
do
{
if (strlen(name) != 0 )
name[strlen(name)] = ' ';

fscanf (input_file, "%s", name + strlen(name) * sizeof(char));
}while(!feof(input_file));
fclose (input_file);
printf("Name:%s\n", name);
system("pause");
return 0;
}

我将列出它们的一些输入和输出。由于并非所有字符都可打印,因此我会将它们键入为\ascii_code,例如\97 = a。最常见的异常是在字符串的最前面添加\31(单位分隔符),以及在姓氏之前(第一个空格之后)添加\12(NP 换页、新页)或\17(设备控制 1)。

  1. 对于“约翰·史密斯”:

    • “John Smith”(正确输出)
    • “\31 约翰·史密斯”
  2. 对于“阿托罗科 cocoa ”

    • “阿托罗科\12Coco”
    • “\31阿托罗科\16Coco”
  3. 对于“米老鼠”

    • “米老鼠”(正确)
    • “\31 Mickey\81Mouse”(字符串中在\81之前有一个\32(空格),但控制台不显示空格?!)

如果编译不同的机器(MacOS,编译器未知),它似乎每次都能正常工作,即它只打印 .txt 的内容。

为什么会产生多个看似随机的输出?为什么要特别添加这些字符(\31、\12 等),而不添加其他字符?

最佳答案

您的代码调用未定义行为 (UB),因为它使用未初始化的name。阅读更多 What is Undefined Behaviour in C?

我们将初始化它,并确保空终止符存在。标准字符串函数(例如 strlen())依赖于 null 终止符来标记字符串的结尾。

然后,您需要确保在调用 feof() 之前阅读了某些内容。此外,最好检查一下 fscanf()返回,表示读取的项目数。

将所有内容放在一起,我们得到:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char input_file_name[255];
FILE * input_file;
char name[255] = "\0"; // initialize it so that is has a null terminator
input_file = fopen ("a.txt","r");
do
{
if (strlen(name) != 0 )
name[strlen(name)] = ' ';
} while (fscanf (input_file, "%s ", name + strlen(name) * sizeof(char)) == 1 && !feof(input_file));
fclose (input_file);
printf("Name:%s\n", name);
return 0;
}

输出(对于“georgios samaras”):

georgios samaras

关于c - 同一程序的不同启动过程中的多个(随机选择)输出。 fscanf'ing 时添加的随机字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53518613/

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