user-0 提问: 奇怪的错误

回复:
user: user-1
content: 请参考scanf的源代码： Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\input.c 的内容。

user: user-2
content: 。。。。

user: user-3
content: 竟然只让回复三次。。。。 查了一下ascii码表：  结论应该就是非法输入吧。

user: user-0
content: 对数据做了简单的测试： 测试一： #include <iostream> #include <cstdlib> #include <cstdio> using namespace std;  int main() { 	int m, n, t; 	printf("%d\n",scanf("%d%d",&m,&n)); 	printf(" %d\n", scanf("%d", &t)); 	printf("%d", t); 	system("pause"); 	return 0; } 输入为：3 3　 输出为：　  测试二： #include <cstdio> #include <cstring> int main() {     char str[1000];     gets(str);     for(int i = 0; i < strlen(str); i++)         printf("%d", str[i]);     printf("\n"); }  输出为：

user: user-0
content: 接楼上  输出后奔溃

user: user-0
content: 引用 3 楼 qq423399099 的回复:楼主的数据是不是从文件里输入的？ 两个文件的区别在于第二个文件后面多了一些空白符（空格，tab之类的吧，或者不可见的一些字符？） 报错的原因是因为楼主你自己发的那个图上，a[i].r的值是0xcccccccc Visual C++在Debug模式下，会把栈上的变量初始化用0XCC填充,是一个未初始化的值转成十进制就是-858993460 所以很明显a[i].r并没有读到值 num[-858993460]++;楼主说能不报错吗printf("%d\n",scanf("%d%d",&m,&n)); 我把输入改成这样，输出scanf的返回值，一次性输出两个2， 0，然后奔溃

user: user-0
content: 目前尝试过利用memset初始化数据，也尝试过将变量都声明为全局变量，但是错误依旧。

user: user-0
content: 同样的数据，第一个可以运行出来结果，第二个不行 版本1： 3 3　　 1 1 1　　 2 2 2　　 2 3 4　　 3 1 -4　　 0 0 0　　 3 3 1 3 -2　　 2 3 -5　　 3 1 8　　 3 2 -6　　 0 0 0  版本2 3 3　　 1 1 1　　 2 2 2　　 2 3 4　　 3 1 -4　　 0 0 0　　 3 3 1 3 -2　　 2 3 -5　　 3 1 8　　 3 2 -6　　 0 0 0 版本2的错误如下图：

user: user-1
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-2
content: 楼主的数据是不是从文件里输入的？ 两个文件的区别在于第二个文件后面多了一些空白符（空格，tab之类的吧，或者不可见的一些字符？） 报错的原因是因为楼主你自己发的那个图上，a[i].r的值是0xcccccccc Visual C++在Debug模式下，会把栈上的变量初始化用0XCC填充,是一个未初始化的值转成十进制就是-858993460 所以很明显a[i].r并没有读到值 num[-858993460]++;楼主说能不报错吗

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:Format Specification Fields: scanf and wscanf Functions A format specification has the following form:  % [width] [{h | l | I64 | L}]type  The format argument specifies the interpretation of the input and can contain one or more of the following:   White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.   Non–white-space characters, except for the percent sign (%). A non–white-space character causes scanf to read, but not store, a matching non–white-space character. If the next character in stdin does not match, scanf terminates.   Format specifications, introduced by the percent sign (%). A format specification causes scanf to read and convert characters in the input into values of a specified type. The value is assigned to an argument in the argument list.  The format is read from left to right. Characters outside format specifications are expected to match the sequence of characters in stdin; the matching characters in stdin are scanned but not stored. If a character in stdin conflicts with the format specification, scanf terminates, and the character is left in stdin as if it had not been read.  When the first format specification is encountered, the value of the first input field is converted according to this specification and stored in the location that is specified by the first argument. The second format specification causes the second input field to be converted and stored in the second argument, and so on through the end of the format string.  An input field is defined as all characters up to the first white-space character (space, tab, or newline), or up to the first character that cannot be converted according to the format specification, or until the field width (if specified) is reached. If there are too many arguments for the given specifications, the extra arguments are evaluated but ignored. The results are unpredictable if there are not enough arguments for the format specification.  Each field of the format specification is a single character or a number signifying a particular format option. The type character, which appears after the last optional format field, determines whether the input field is interpreted as a character, a string, or a number.   The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign (%) is followed by a character that has no meaning as a format-control character, that character and the following characters (up to the next percent sign) are treated as an ordinary sequence of characters, that is, a sequence of characters that must match the input. For example, to specify that a percent-sign character is to be input, use %%.  An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.赵老师，White-space characters: blank (' '); tab ('\t'); or newline ('\n').既然这样，读入不存储，为啥还会造成上面那种情况呢？

user: user-1
content: Format Specification Fields: scanf and wscanf Functions A format specification has the following form:  % [width] [{h | l | I64 | L}]type  The format argument specifies the interpretation of the input and can contain one or more of the following:   White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.   Non–white-space characters, except for the percent sign (%). A non–white-space character causes scanf to read, but not store, a matching non–white-space character. If the next character in stdin does not match, scanf terminates.   Format specifications, introduced by the percent sign (%). A format specification causes scanf to read and convert characters in the input into values of a specified type. The value is assigned to an argument in the argument list.  The format is read from left to right. Characters outside format specifications are expected to match the sequence of characters in stdin; the matching characters in stdin are scanned but not stored. If a character in stdin conflicts with the format specification, scanf terminates, and the character is left in stdin as if it had not been read.  When the first format specification is encountered, the value of the first input field is converted according to this specification and stored in the location that is specified by the first argument. The second format specification causes the second input field to be converted and stored in the second argument, and so on through the end of the format string.  An input field is defined as all characters up to the first white-space character (space, tab, or newline), or up to the first character that cannot be converted according to the format specification, or until the field width (if specified) is reached. If there are too many arguments for the given specifications, the extra arguments are evaluated but ignored. The results are unpredictable if there are not enough arguments for the format specification.  Each field of the format specification is a single character or a number signifying a particular format option. The type character, which appears after the last optional format field, determines whether the input field is interpreted as a character, a string, or a number.   The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign (%) is followed by a character that has no meaning as a format-control character, that character and the following characters (up to the next percent sign) are treated as an ordinary sequence of characters, that is, a sequence of characters that must match the input. For example, to specify that a percent-sign character is to be input, use %%.  An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.

user: user-0
content: 引用 3 楼 qq423399099 的回复:楼主的数据是不是从文件里输入的？ 两个文件的区别在于第二个文件后面多了一些空白符（空格，tab之类的吧，或者不可见的一些字符？） 报错的原因是因为楼主你自己发的那个图上，a[i].r的值是0xcccccccc Visual C++在Debug模式下，会把栈上的变量初始化用0XCC填充,是一个未初始化的值转成十进制就是-858993460 所以很明显a[i].r并没有读到值 num[-858993460]++;楼主说能不报错吗我复制粘贴的数据，应该也算是文件出入吧。为什么scanf或者cin没有过滤掉空格或者tab呢