C编程 - 编译错误:格式'%s'需要类型'char *'

时间:2014-01-15 00:54:10

标签: c

来源:

/*
* 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

5 个答案:

答案 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);  

旁注:绝不要使用scanfgets来读取字符串,因为它不会检查数组绑定。最好使用{{1} }。

fgets

答案 3 :(得分:0)

默认情况下,数组作为指针传递。请改用它......

scanf("%s", fileName);

此外,我在某处读过你不应该使用EOF来检查文件是否已被读完。

答案 4 :(得分:0)

使用

时会发生什么
scanf("%99", filename);

其中'99'是您要接受的最大长度输入,'filename'没有&符号(因为您想指向char的第一个filename,而不是地址filename)?

cplusplus.com::scanf