user-0 提问: 【swu】 判断参数是否有效，参数为7个数字。

回复:
user: user-0
content: 引用 11 楼 u012586257 的回复:[quote=引用 楼主 u014016447 的回复:]   1 #include <stdio.h>   2   3 int main ()   4 {   5         FILE *fp;   6         int i, k, tmp, q;   7         int num[7];   8         fp = fopen("data.in","r");   9         for (q=0;q<7;q++)            你这里已经读过了，后面要再读，得先把文件指针回到文件头。  10                 fscanf(fp, "%d", &num[q]);  11         if(fp==NULL){  12                 fprintf(stderr,"Can't open the file.\n");  13                 return 1;  14         }  15         for(q=0; q<7; q++){  16                 if(fscanf(fp, "%d", &num[i]) != 1){  17                         fprintf(stderr,"Valid\n");  18                         return 2;  19                 }   为什么这里总是输出Valid，我外面的data.in 文件里面只有7个数字，而且用了空格号隔  20         }                                                   开了的。  21         for(i=0; i<7; i++){  22                 for(k=0; k<7-i-1; k++){  23                         if(num[k]>num[k+1]){  24                                 tmp = num[k+1];  25                                 num[k+1] = num[k];  26                                 num[k] = tmp;  27                         }  28                 }  29         }  30         for(q=0;q<7;q++)  31                 printf("%d ",num[q]);  32         printf("\n");  33         return 0;  34 } 把第9，10行注释掉[/quote]     非常感谢，就是这里有问题！

user: user-1
content: 引用 楼主 u014016447 的回复:1 #include <stdio.h>   2   3 int main ()   4 {   5         FILE *fp;   6         int i, k, tmp, q;   7         int num[7];   8         fp = fopen("data.in","r");   9         for (q=0;q<7;q++)            你这里已经读过了，后面要再读，得先把文件指针回到文件头。  10                 fscanf(fp, "%d", &num[q]);  11         if(fp==NULL){  12                 fprintf(stderr,"Can't open the file.\n");  13                 return 1;  14         }  15         for(q=0; q<7; q++){  16                 if(fscanf(fp, "%d", &num[i]) != 1){  17                         fprintf(stderr,"Valid\n");  18                         return 2;  19                 }   为什么这里总是输出Valid，我外面的data.in 文件里面只有7个数字，而且用了空格号隔  20         }                                                   开了的。  21         for(i=0; i<7; i++){  22                 for(k=0; k<7-i-1; k++){  23                         if(num[k]>num[k+1]){  24                                 tmp = num[k+1];  25                                 num[k+1] = num[k];  26                                 num[k] = tmp;  27                         }  28                 }  29         }  30         for(q=0;q<7;q++)  31                 printf("%d ",num[q]);  32         printf("\n");  33         return 0;  34 } 把第9，10行注释掉

user: user-2
content: 引用 9 楼 u014016447 的回复:[quote=引用 8 楼 JiMoKuangXiangQu 的回复:] [quote=引用 6 楼 u014016447 的回复:] [quote=引用 2 楼 user-5 的回复:]     for(q=0; q<7; q++){                  if(fscanf(fp, "%d", &num[q]) != 1)               {                          fprintf(stderr,"Valid\n");                         return 2;    我写的很你有什么不同吗？[/quote] 这位的回复已经用红色标记出来了，数组的下标记应该用q而不是i，因为您的循环里面用的变量q。[/quote]    改了之后还是不行。[/quote] 好吧，我再做一次坏人吧。修改后的代码如下：  #define _CRT_SECURE_NO_DEPRECATE // needed by vs2013  #include <stdio.h>  int main() { 	FILE *fp; 	int i, k, tmp, q; 	int num[7];  	fp = fopen("data.in", "r"); 	if (fp == NULL) { 		fprintf(stderr, "Can't open the file.\n"); 		return 1; 	}  	// 这里的代码是重复的逻辑，所以注释掉了 	//for (q = 0; q < 7; q++) 	//	fscanf(fp, "%d", &num[q]); 	for (q = 0; q < 7; q++) { 		if (fscanf(fp, "%d", &num[q/*i*/]) != 1) { 			// 为什么这里总是输出Invalid， 			// 我外面的data.in 文件里面只有7个数字，而且用了空格号隔开了的。 			fprintf(stderr, "Invalid\n"); 			return 2; 		}                                                    	}                           	for (i = 0; i < 7; i++) { 		for (k = 0; k < 7-i-1; k++) { 			if (num[k] > num[k + 1]) { 				tmp = num[k + 1]; 				num[k + 1] = num[k]; 				num[k] = tmp; 			} 		} 	}  	for (q = 0; q < 7; q++) 		printf("%d ", num[q]); 	printf("\n");  	return 0; }  data.in: 7 1 4 2 3 6 5  运行输出： 1 2 3 4 5 6 7

user: user-0
content: 引用 8 楼 JiMoKuangXiangQu 的回复:[quote=引用 6 楼 u014016447 的回复:] [quote=引用 2 楼 user-5 的回复:]     for(q=0; q<7; q++){                  if(fscanf(fp, "%d", &num[q]) != 1)               {                          fprintf(stderr,"Valid\n");                         return 2;    我写的很你有什么不同吗？[/quote] 这位的回复已经用红色标记出来了，数组的下标记应该用q而不是i，因为您的循环里面用的变量q。[/quote]    改了之后还是不行。

user: user-2
content: 引用 6 楼 u014016447 的回复:[quote=引用 2 楼 user-5 的回复:]     for(q=0; q<7; q++){                  if(fscanf(fp, "%d", &num[q]) != 1)               {                          fprintf(stderr,"Valid\n");                         return 2;    我写的很你有什么不同吗？[/quote] 这位的回复已经用红色标记出来了，数组的下标记应该用q而不是i，因为您的循环里面用的变量q。

user: user-2
content: 引用 5 楼 u014016447 的回复:[quote=引用 1 楼 JiMoKuangXiangQu 的回复:] 先且不论fscanf的用法，想想看，如果几个数字连在一起，fscanf如何知道你只要读一个数字，那不是一下子全给读进去了吗？ fscanf的用法，请参考： http://www.cplusplus.com/reference/cstdio/fscanf/?kw=fscanf   我文件data.in 用了空格隔开了的！[/quote] 是的，我看到您在描述中说用空格隔开了，我想说的是...哎，不重要了，重要的似乎帮助文档没能吸引您的眼球。 我贴在这里吧，希望可以对您有所帮助。  stream Pointer to a FILE object that identifies the input stream to read data from. format C string that contains a sequence of characters that control how characters extracted from the stream are treated: Whitespace character: the function will read and ignore any whitespace characters encountered before the next non-whitespace character (whitespace characters include spaces, newline and tab characters -- see isspace). A single whitespace in the format string validates any quantity of whitespace characters extracted from the stream (including none). Non-whitespace character, except format specifier (%): Any character that is not either a whitespace character (blank, newline or tab) or part of a format specifier (which begin with a % character) causes the function to read the next character from the stream, compare it to this non-whitespace character and if it matches, it is discarded and the function continues with the next character of format. If the character does not match, the function fails, returning and leaving subsequent characters of the stream unread. Format specifiers: A sequence formed by an initial percentage sign (%) indicates a format specifier, which is used to specify the type and format of the data to be retrieved from the stream and stored into the locations pointed by the additional arguments.

user: user-0
content: 引用 2 楼 user-5 的回复:for(q=0; q<7; q++){                  if(fscanf(fp, "%d", &num[q]) != 1)               {                          fprintf(stderr,"Valid\n");                         return 2;    我写的很你有什么不同吗？

user: user-0
content: 引用 1 楼 JiMoKuangXiangQu 的回复:先且不论fscanf的用法，想想看，如果几个数字连在一起，fscanf如何知道你只要读一个数字，那不是一下子全给读进去了吗？ fscanf的用法，请参考： http://www.cplusplus.com/reference/cstdio/fscanf/?kw=fscanf   我文件data.in 用了空格隔开了的！

user: user-3
content: fscanf函数的返回值是实际能读取的数据个数，你的文件里有7个数据，返回值便是7，符合你的表达式：返回值不等于1，所以执行了你设置的报错语句

user: user-4
content: fsanf   函数不能多次读取数据，可以直接用一个变量来存放fscanf函数的返回值

user: user-5
content: for(q=0; q<7; q++){                  if(fscanf(fp, "%d", &num[q]) != 1)               {                          fprintf(stderr,"Valid\n");                         return 2;

user: user-2
content: 先且不论fscanf的用法，想想看，如果几个数字连在一起，fscanf如何知道你只要读一个数字，那不是一下子全给读进去了吗？ fscanf的用法，请参考： http://www.cplusplus.com/reference/cstdio/fscanf/?kw=fscanf