来源:
/*
* Name: Adam Chubbuck
* Date: 1/12/2014
* Class: CSC-1720
* Comment: Assignment #1 (Load-Sort-Print) v1
*/
#include<stdio.h>
int load(char fileName[], int array[]);
int sort(int array[], int length);
int print(int length, int array[]);
int main() {
char fileName[100];
int numList[300];
int length;
printf("File Name: ");
scanf("%s", &fileName);
length = print(sort(numList,load(fileName, numList)), numList);
printf("\nLength: %i\n", length);
printf("Finished execution.\n");
return 0;
}
int load(char fileName[], int array[]) {
FILE *input = fopen(fileName, "r");
int length = 0, i = 0;
if(input == NULL) {
fprintf(stderr, "Error accessing file.\n");
} else {
while(fscanf(input, "%i", &array[i]) != EOF) {
i++;
length++;
}
}
fclose(input);
return length;
}
int sort(int array[], int length) {
int a, b, c;
for (a = 0 ; a < ( length - 1 ); a++) {
for (b = 0 ; b < length - a - 1; b++) {
if (array[b] > array[b+1]) {
c = array[b];
array[b] = array[b+1];
array[b+1] = c;
}
}
}
return length;
}
int print(int length, int array[]) {
int i;
printf("\n[NUMBERS]\n\n");
for (i = 0; i< length; i++) {
printf("[N]%i\n", array[i]);
}
return length;
}
我已经阅读了有关该问题的类似主题,他们建议我从scanf语句中删除&符号,但是当我这样做并使用I / O重定向到文件时,它似乎陷入了无限循环表明它无法为fileName字符数组赋值。
./a.out < test.txt > output.txt
答案 0 :(得分:1)
您已宣布char fileName[100]
。这几乎相当于char*
已经 1 。当你这样做
scanf("%s", &fileName);
它等同于传递char**
。
1 :您可以谷歌搜索指针与数组,看看有什么不同,但是传递参数它们基本相同。
答案 1 :(得分:1)
在C中,一个数组(几乎 1 )与指针相同。因此,获取数组的地址会指向指针。 C中的字符串只是char
的数组。所以在你的陈述中
scanf("%s", &fileName);
您将指针传递给指向scanf
的指针,该指针不它所期望的内容。你应该写
scanf("%s", fileName);
但是请注意,这是一个潜在的缓冲区溢出。 fileName
只有有限的空间,如果输入的内容较长,则会超出fileName
的长度。安全的解决方案是:
scanf("%99s", fileName);
[1]显着的差异是sizeof
运算符的行为。如果它在数组标识符上使用,则它给出了对象占用的char
s中的实际大小。如果它在指针上使用,它会给对象指定指针类型的大小。
答案 2 :(得分:1)
当作为参数传递给函数时,数组名称衰减到指针(有一些例外)。 fileName
衰减到指向数组fileName
的第一个元素的指针。它的类型为char *
,即它是数组第一个元素的地址
另一方面,&fileName
是整个数组的地址,类型为char (*)[100]
。
%s
说明符期望类型char *
的参数。您需要将fileName
传递给scanf
作为参数
当您将&fileName
作为scanf
的参数传递时,编译器会发现它不是函数scanf
的预期类型的参数,因此会抛出错误。
改变
scanf("%s", &fileName);
到
scanf("%s", fileName);
旁注:绝不要使用scanf
或gets
来读取字符串,因为它不会检查数组绑定。最好使用{{1} }。
fgets
答案 3 :(得分:0)
默认情况下,数组作为指针传递。请改用它......
scanf("%s", fileName);
此外,我在某处读过你不应该使用EOF来检查文件是否已被读完。
答案 4 :(得分:0)
使用
时会发生什么scanf("%99", filename);
其中'99'是您要接受的最大长度输入,'filename'没有&符号(因为您想指向char
的第一个filename
,而不是地址filename
)?