首页 > 解决方案 > while循环中变量变化的问题

问题描述

我的简单程序是从文本文件中一次读取一个单词。

示例文本文件。(以下)

N 101001 循环队列 11 1

N 123456 列表链接器 11 5

N 666666 伪代码 Gen 38 3

N 110010 堆叠式担架 3 2

和简单的代码,包括变量等......

char function;
    int number, init_stock, reorder;
    char info[100];

    FILE *fp;
    if((fp = fopen("input.txt", "r")) == NULL)
    {
        printf("input open failed\n");
        return 0;
    }
    while(!feof(fp))
    {
        fscanf(fp, "%c %d %[A-z, ] %d %d ", &function, &number, info, &init_stock, &reorder);

    }

当一个变量在'while循环'中被改变时,

我希望在下一个循环中也会影响它。

所以..首先,“循环队列”存储在“信息”中。

其次,当“列表链接器”存储在“信息”中时,因为第二个字符串比第一个字符串短,

我认为信息数组有这样的字符串'List Linkerue'。

  1. info -- 循环队列
  2. info -- 列出链接器+ ue

但是信息似乎每次都被重置,我不知道为什么。

标签: cvariableswhile-loopscanf

解决方案


在第一遍中,最后的内容info"Circular Queue \0"The\0表示单个零字节,它是空字符。这告诉函数,比如printf字符串在哪里结束。

请注意,最后还有一个空格。

第二遍的内容info"List Linker \0e"。正如你所怀疑的,fscanf没有填满整个字符串。但它确实添加了空字符,所以你看不到e最后的。内容info将是

1st pass: "Circular Queue " ... followed by random bytes
2nd pass: "List Linker \0e "

您还可以通过将格式更改为 100 字节(包括空字符)来改进您的功能,%99[A-z, ]info确保fscanf按预期读取 5 个值。您也可以考虑更改输入,以便用逗号分隔值。

while(fscanf(fp, "%c %d %99[A-z, ] %d %d ", 
    &function, &number, info, &init_stock, &reorder) == 5)
{
    //optional: remove the extra space at the end of info
    int len = strlen(info);
    if(len)
        if(info[len - 1] == ' ')
            info[len - 1] = 0;
    printf("string: [%s] %d\n", info, number);
}

推荐阅读