【发布时间】:2014-12-16 07:19:36
【问题描述】:
输入 -
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?
【问题讨论】:
-
代码存在一些问题,尤其是 scanf 调用:代码应始终检查 scanf 返回的代码,以确保操作成功。格式字符串应该(几乎)总是以前导 ' ' (空格)开头,因此在任何输入之前都会跳过空格。输入是每行 6 个字符,每个缓冲区只有 6 个字符。 printf 正在尝试使用 '%s' 打印字符串,但是,'string' 缺少终止 nul 字符,因此第一个 printf 继续运行,直到遇到 nul char,这是未定义的行为,可能导致 seg故障事件
-
建议:使缓冲区(至少)7 个字符长,并在调用 scanf 之前将缓冲区内容预设为全部 '\0'。注意:scanf 不会在输入字符数组的末尾插入 nul 字符。