while循环中变量更改的问题

时间:2018-06-09 19:47:08

标签: c variables while-loop scanf

  

我的简单程序一次只能从文本文件中读取一个字。

示例文本文件。 (下同)

N 101001循环队列11 1

N 123456 List Linker 11 5

N 666666 Pseudocode Gen 38 3

N 110010 Stack Stretcher 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 loop',

     

我预计也会影响下一个循环。

所以..首先,'循环队列'存储在' info'中。

第二,何时列出链接器'存储在' info'因为第二个字符串比第一个字符串短,

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

  
      
  1. info - 循环Que ue
  2.   
  3. info - 列出链接器+ ue
  4.   

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

1 个答案:

答案 0 :(得分:0)

在第一遍中,info的内容为"Circular Queue \0"末尾的\0表示单个零字节,它是空字符。这告诉像printf这样的函数,其中字符串结束。

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

在第二次传递中,info的内容为"List Linker \0e"。如您所料,fscanf没有填写整个字符串。但它确实添加了空字符,因此您无法在最后看到einfo的内容将是

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

您还可以通过将格式更改为%99[A-z, ]来改进您的功能,因为info是100个字节(包括空字符)并确保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);
}