看来我的fgets()实现在这里是不正确的,非常感谢一些额外的眼睛来看看我做了什么!
这是代码
int main(int argc, const char* argv[]){
int numIntegers;
char buffer[20];
int intArray[10];
//if no argument is passed in, terminate
if (argc == 1){
printf("no argument given, terminating..\n");
return EXIT_FAILURE;
}
else{
numIntegers = atoi(argv[1]);
//we only want numbers greater than 0
if (numIntegers <= 0){
printf("# must be greater than 0\n");
return EXIT_FAILURE;
}
else{
printf("Enter %d integer values to place in array: \n", numIntegers);
for (int i = 0; i < numIntegers; i++){
fgets(buffer, numIntegers, stdin);
intArray[i] = atoi(buffer);
printf("Index is = %d \n", i);
}
}
}
//for (int i =0; i < numIntegers; i++){
// printf("Index[%d] = %d \n", i, intArray[i]);
//}
}
这是输出,除了整数之外没有其他文本的行是用户输入。注意i的值是如何重置的。只有当我给出10以上的初始参数时才会出现这个问题。无论出于何种原因,它都会将for循环变为无限循环。
$ ./a.out 11
Enter 11 integer values to place in array:
5
Index is = 0
2
Index is = 1
1
Index is = 2
2
Index is = 3
3
Index is = 4
4
Index is = 5
123
Index is = 6
123
Index is = 7
123
Index is = 8
1
Index is = 9
2
Index is = 2
2
Index is = 3
3
Index is = 4
5
Index is = 5
1
Index is = 6
12
Index is = 7
答案 0 :(得分:2)
您正在使用
fgets(buffer, numIntegers, stdin);
第二个参数应该是缓冲区的大小 - 在你的情况下,20。这至少是一个明显的问题......
下一个问题:您允许numIntegers
大于10 - 因此您将在intArray
的末尾写下值。需要解决这个问题......
if(numIntegers > 10) {
printf("cannot have number greater than 10!\n");
// abort, retry, ignore...
}
事实上 - 这是您的代码,解决了错误:请注意BUFSIZE
和MAXNUM
使用已定义的尺寸,这样您就不必在多个地方更改它改变主意...
#include <stdio.h>
#define BUFSIZE 20
#define MAXNUM 10
#define EXIT_FAILURE 0
int main(int argc, const char* argv[]){
int i, numIntegers;
char buffer[BUFSIZE];
int intArray[MAXNUM];
//if no argument is passed in, terminate
if (argc == 1){
printf("no argument given, terminating..\n");
return EXIT_FAILURE;
}
else{
numIntegers = atoi(argv[1]);
//we only want numbers greater than 0
if (numIntegers <= 0 || numIntegers > MAXNUM){
printf("# must be greater than 0 and less than %d!\n", MAXNUM);
return EXIT_FAILURE;
}
else{
printf("Enter %d integer values to place in array: \n", numIntegers);
for (i = 0; i < numIntegers; i++){
fgets(buffer, BUFSIZE, stdin);
intArray[i] = atoi(buffer);
printf("Index is = %d \n", i);
}
}
}
}
最后 - 您可能想知道为什么整数计数器似乎“重置”了?好吧 - 你的intArray
是一个10个整数的块;当你声明循环变量i
时,它占据内存中的 next 位置(因为int intArray[10];
是在你到达{{1}之前声明变量的最后一次当你“索引”到for
(你不允许访问的内存位置,但无论如何你做了)时,你碰巧遇到了这种情况。您碰巧输入了值intArray[10]
- 因此,2
已重置为i
...
如果你在程序开始时声明2
(正如我所做的那样,因为我的编译器默认情况下没有“做”C99 - 我已经老了!),问题会出现不同 - 或根本不。