输入-
COMETQ
HVNGAT
这是代码-
#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 6
main(void)
{
char comet[MAXLEN], group[MAXLEN];
unsigned long int result[2] = { 1,1 };
short int i, j;
scanf("%s",comet);
scanf("%s",group);
printf("\nComet's Name: %s\nGroup's Name: %s",comet,group);
printf("\nComet's No.: %ld\nGroup's No.: %ld",result[0],result[1]);
i = j = 0;
while(comet[i]!='\0' && i<MAXLEN){
result[0] *= (comet[i] - 'A' + 1);
i++;
}
while(group[j]!='\0' && j<MAXLEN){
result[1] *= (comet[j] - 'A' + 1);
j++;
}
printf("\nComet's No.: %ld\nGroup's No.: %ld",result[0],result[1]);
printf("\nComet's No. Mod 47: %ld\nGroup's No. Mod 47: %ld",result[0]%47,result[1]%47);
if(result[0]%47 == result[1]%47)
printf("\nGO");
else
printf("\nSTAY");
exit(0);
}
现在,据我所知,scanf() 读取字符串直到检测到空格。但是在这里,输出是-
Comet's Name: COMETQHVNGAT
Group's Name: HVNGAT
Comet's No.: 1
Group's No.: 1
Comet's No.: -534663680
Group's No.: 994500
Comet's No. Mod 47: 43
Group's No. Mod 47: 27
STAY
但是,不应该是这样吗?
comet = "COMETQ" & Group = "HVNGAT"
我不明白为什么没有发生这种情况?
另外,当comet
的大小为6字节时,如何存储-COMETQHVNGAT
?
最佳答案
如果您想将 char
数组用作字符串,则需要以 null 终止它。
在您的代码中,数组长度指定为 6
,而您的输入本身是 6
字节,没有空间来存储终止空字符。这就是为什么当 comet
和 group
被传递给 printf()
时,它们会产生奇怪的输出。
一个字符串是空终止的,基于这个原则,你的情况下的内存访问将超过 comet
和 group
的分配内存大小,产生 undefined behaviour .
更安全的选择:
使用fgets()
读取输入,受缓冲区大小限制,去掉最后一个\n
字符,就可以了-去。查看 man page 了解详情。
此外,对于 unsigned long int
,您需要将格式说明符 %ld
更改为 %lu
。 %ld
用于signed long int
。
关于c - 无法理解以下代码中的 scanf() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27499476/