【问题标题】:How does %n work with variables [duplicate]%n 如何处理变量[重复]
【发布时间】:2015-04-04 17:54:35
【问题描述】:

所以我环顾四周,发现关于 %n 的一般信息很少,也没有关于如何将它与变量一起使用的信息。

据我所知,我使用的代码应该可以工作,但我不知道它不是什么。我遇到问题的特定行是:

printf("%d %n", num[x], &c);

下面是完整的代码。

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

int main(void)
{
        //seed rand, declare arrays, declare variables
        srand(time(NULL));
        int num[10];
        int c = 0;
        int total = 0;
        int x;

    printf( "%s%14s%20s\n", "Value", "Characters", "Total Characters" );

    //Loads the num array with random numbers.
    for(x = 1; x  < 10; x++)
    {
            num[x] = 1 + rand() % 1000;
    }

    for (x = 1; x < 10; x++)
    {
            printf("%d %n", num[x], &c);
            printf("%14d", c);
            total = total + c;
            printf("%20d\n", total);
    }
}

【问题讨论】:

  • 顺便说一句:对 rand() 的输出进行 any 类型的计算将在统计上 减少 其随机性,您正在有效地生成伪随机数哪些是更多可预测的。
  • @specializt 当然,“对 rand() 输出的任何类型的计算都会降低其随机性”夸大了您原本有效的担忧。示例:num[x] = rand() ^ 12345; 不会这样做。
  • 在输出上使用 XOR 会降低其随机性 - 您只是将可能的值缩小到一个较小的集合。这是初学者的常见错误,也是密码系统在某些时候被破坏的真正原因。如果您想要任何程度的随机性,您需要获得一个可以创建所需范围的来源。就这么简单。要么继续收集数据,直到某些东西在你的范围内——这也将减少随机性,但至少值到达的时间点是不可预测的,这至少是一些讨价还价

标签: c printf


【解决方案1】:

来自 C 标准

n 参数应该是一个指向有符号整数的指针,其中 写入了到目前为止写入输出流的字符数 通过这个对 fprintf 的调用。没有参数被转换,但一个是 消耗。如果转换规范包含任何标志,则字段 宽度或精度,行为未定义。

同样适用于printf

这是一个演示程序

#include <stdio.h>

int main(void) 
{
    int n1, n2;

    printf( "%s%n%s%n\n", "Hello", &n1, " World", &n2 );

    printf( "%d\t%d\n", n1, n2 );

    return 0;
}

程序输出是

Hello World
5   11

【讨论】:

  • 我读过这个,但我仍然遇到问题。我不知道我是否使用了不正确的语法或者我错过了什么。据我所知,从我找到的所有示例中,我都做对了,但我的输出读起来好像没有任何东西存储到变量中。
  • @s.lucas 查看我更新的帖子,现在包含一个示例。
猜你喜欢
  • 2017-01-06
  • 2017-10-29
  • 2016-09-22
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多