C中随机字符生成器的奇怪结果
Weird result from random character generator in C
我正在尝试用 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...]
所以问题是,为什么它会这样?
避免这种情况的更好方法是什么?
Jabberwocky 和 Federico klez Culloca 的评论是正确的。
我试图将字符打印为字符串。这是错误的,做了奇怪的事情。
我需要使用:
printf("%d:%c\n", index, misc);
而不是
printf("%d:%s\n", index, &misc);
一切都很简单。该程序具有未定义的行为。您正在使用用于输出字符串的格式字符串 %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);
我正在尝试用 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...]
所以问题是,为什么它会这样? 避免这种情况的更好方法是什么?
Jabberwocky 和 Federico klez Culloca 的评论是正确的。 我试图将字符打印为字符串。这是错误的,做了奇怪的事情。 我需要使用:
printf("%d:%c\n", index, misc);
而不是
printf("%d:%s\n", index, &misc);
一切都很简单。该程序具有未定义的行为。您正在使用用于输出字符串的格式字符串 %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);