【问题标题】:Weird result from random character generator in CC中随机字符生成器的奇怪结果
【发布时间】:2020-04-09 16:25:21
【问题描述】:

我正在尝试用 C 语言编写一个吐出随机字符的程序。按照我找到here的说明,我编写了这个程序。

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


int main(void) {
   srandom((unsigned) time(NULL));
   printf("Tests various aspects of random\n");
   char misc;
   int num, index;
   printf("Enter number of chars: ");
   scanf("%d", &num);
   printf("\n");

   for (int i = 0; i < num; i++) {
      index = random() % 26;
      misc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[index];
      printf("%d:%s\n", index, &misc);
   }
}

但是,它的行为不像我预期的那样。当输入少量字符以生成(例如 10 个)时,它会产生预期的输出。

我的预期输出是一组

rand_int:char

成对打印到屏幕上。

这里是一个正常操作的例子

Tests various aspects of random
Enter number of chars: 
7:H

4:E

23:X

2:C

4:E

17:R

22:W

11:L

9:J

4:E

但是,如果我输入一个很大的值,比如 100,它会输出非常奇怪的东西,比如:

Tests various aspects of random
Enter number of chars: 
18:Sd
3:Dd
21:Vd
10:Kd
19:Td
19:Td
14:Od
7:Hd
15:Pd
22:Wd
24:Yd
22:Wd
12:Md
[rest omitted for brevity...]

所以问题是,为什么它会这样? 有什么更好的方法可以避免这种情况?

【问题讨论】:

  • printf("%d:%s\n", index, &amp;misc); -> printf("%d:%c\n", index, misc);
  • misc 是 char,而不是字符串。使用 %s 打印它是在调用未定义的行为。
  • 除了我之外的任何人都认为这应该因为简单的印刷错误而关闭?

标签: c random char printf undefined-behavior


【解决方案1】:

Jabberwocky 和 ​​Federico klez Culloca 制作的 cmets 做对了。 我试图将字符打印为字符串。这是错误的,并且做了一些奇怪的事情。 我需要使用:

printf("%d:%c\n", index, misc);

而不是

printf("%d:%s\n", index, &misc);

【讨论】:

    【解决方案2】:

    一切都很简单。该程序具有未定义的行为。您正在使用用于输出字符串的格式字符串%s。

    printf("%d:%s\n", index, &misc);
    

    但是变量misc 不是包含字符串的字符数组。它只是一个字符。所以函数printf 会输出变量misc 之外的所有字符,直到遇到一个以零结尾的字符。

    而且似乎变量num 分配在变量misc 旁边。所以 printf 调用也会输出包含值 100 的变量 num 的字节。如果要将存储在字节中的这个值作为 ASCII 字符输出,那么您将得到字符 'd'。

    这是一个演示程序。

    #include <stdio.h>
    
    int main(void) 
    {
        char c = 100;
    
        putchar( c );
        putchar( '\n' );
    
        return 0;
    }
    

    它的输出是

    d
    

    在 printf 调用中使用 %c 格式而不是 %s 格式。例如

    printf("%d:%c\n", index, misc);
    

    【讨论】:

    • 您可能希望在 putchar() 调用之后打印一个换行符。
    猜你喜欢
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 2015-05-10
    相关资源
    最近更新 更多