gcc scanf的无效初始值设定项[已关闭]

dm7nw8vv  于 2023-02-16  发布在  其他
关注(0)|答案(2)|浏览(155)
    • 已关闭**。此问题需要超过focused。当前不接受答案。
    • 想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

昨天关门了。
Improve this question
我不接受任何答案!
GCC不会编译我的代码,因为scanf是一个"无效的初始化器",我不明白为什么它不会编译。
验证码:

#include <stdio.h>
#ifdef WIN32
#include <io.h>
#define F_OK 0
#define access _access
#endif

int main() {
  // vars
  FILE *fptr;
  char opt = scanf("");
  char contents[99999999999] = "";

  printf("Logging system | always add date!");
  printf("SELECT:\n_______________________\na     Write to the log\nr     Read the log");
  if (access(fptr, F_OK) == 0) {
    fptr = fopen("log_sys.log", "w");
} else {
      if (opt == "a") {
        fptr = fopen("log_sys.log", "a");
        char a[190] = scanf("LOG(max 190 char):   ");
        fprintf(fptr, a[190]);
        fclose(fptr);

  } else if (opt == "r") {
    fptr = fopen("filename.txt", "r");
    fgets(contents, 1215752191, fptr);
    printf("%s", contents);
  }
  
}
  

  system("pause");
  return 0;
}

这是一个字符串记录器,一般用途为人们写文件,就像一个后,它的说明。

83qze16e

83qze16e1#

要回答您的具体问题:

  1. char a[190] = scanf("LOG(max 190 char): ");无法编译,因为scanf()不是有效的数组初始值设定项。
    另外两个错误是:
  2. F_OK未声明,因为至少在Linux上缺少标头。
  3. fprintf()语法错误。
    您可能需要这样的内容:
#include <fcntl.h>
#define A_LEN 189
#define str(s) str2(s)
#define str2(s) #s

// ...

printf("LOG(max %d char):   ", A_LEN);
char a[A_LEN+1];
if(scanf("%" str(A_LEN) "s", a) != 1) {
   printf("scanf failed\n");
   fclose(fptr);
   return 1;
}
printf(fptr, "%s", a);

这仍然留下了许多警告和其他问题:

  1. scanf():您可能希望指定一个格式字符串和您想要设置的变量。我修复了上面的问题,但您还希望修复第一个scanf()
  2. scanf()返回int,您希望检查该返回值以确保成功。
    1.在Linux上,它没有声明为access()(您需要包含unistd. h)。
  3. access()采用路径,但它传递了未初始化的FILE指针。
    1.您不检查fopen()是否成功。
    1.在退出所有代码路径之前,不要执行close(ftpr)
  4. system("pause")是windows特定的,没有任何原因。
    1.如果access()失败,则调用毫无意义的fptr = fopen("log_sys.log", "w");,然后不执行任何其他操作。
    1.在堆栈上分配99 GB可能会失败。在我的系统上,默认堆栈大小是8 MB。
    我建议你拿起一本关于C的教科书。否则它会让你非常沮丧。从小处开始。我如何阅读一个字符。一旦成功,你就可以做测试了。忘记试图便携,让它在你的机器上工作就行了。
sz81bmfz

sz81bmfz2#

你 * 真的 * 需要仔细阅读scanf--它不返回字符串,它返回成功读取和赋值的项数,或者EOF出错或文件结束,也不写任何提示符。
具体问题是线路

char a[190] = scanf("LOG(max 190 char):   ");

char数组的初始化器必须是一个用大括号括起来的值列表或者是一个字符串。如上所述,scanf返回一个整数值。如果你把scanf调用用大括号括起来,它应该可以编译--当然,它不会做你在这里想要它做的事情。

相关问题