【问题标题】:C Program - warning: initializer-string for array of chars is too longC 程序 - 警告:字符数组的初始化字符串太长
【发布时间】:2016-11-10 10:17:24
【问题描述】:

由于我是 C 编程新手,请多多包涵,这是我的代码:

#include <stdio.h>
#include <sys/stat.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    char name[0] = "/tmp/crt/client.conf";
    char name[1] = "/tmp/crt/haha";
    char name[2] = "/tmp/crt/Router.ovpn";
    char name[3] = "/tmp/crt/Router.txt";
    char name[4] = "/tmp/crt/sgdo11-tcpvpn.com-443.ovpn";
    char name[5] = "/tmp/crt/sgdo1-tcpvpn.com-443.ovpn";
    char name[6] = "/tmp/crt/sshdropbear.net-2016-10-22.ovpn";
    char name[7] = "/tmp/crt/sshdropbear.net.txt";
    char name[8] = "/tmp/crt/tcpvpn.txt";
    char name[9] = "/tmp/crt/test15.ovpn";
    char name[10] = "/tmp/crt/test15.txt";
    char name[11] = "/tmp/crt/UDP-1197.ovpn";
    char name[12] = "/tmp/crt/udp.group-1194-exp11nov.ovpn";
    char name[13] = "/tmp/crt/udp.group-1194.txt";

    int def_size[0] = 5874; // FILE: /tmp/crt/client.conf
    int def_size[1] = 1; // FILE: /tmp/crt/haha
    int def_size[2] = 2091; // FILE: /tmp/crt/Router.ovpn
    int def_size[3] = 15; // FILE: /tmp/crt/Router.txt
    int def_size[4] = 5694; // FILE: /tmp/crt/sgdo11-tcpvpn.com-443.ovpn
    int def_size[5] = 2092; // FILE: /tmp/crt/sgdo1-tcpvpn.com-443.ovpn
    int def_size[6] = 1779; // FILE: /tmp/crt/sshdropbear.net-2016-10-22.ovpn
    int def_size[7] = 36; // FILE: /tmp/crt/sshdropbear.net.txt
    int def_size[8] = 33; // FILE: /tmp/crt/tcpvpn.txt
    int def_size[9] = 5855; // FILE: /tmp/crt/test15.ovpn
    int def_size[10] = 26; // FILE: /tmp/crt/test15.txt
    int def_size[11] = 4983; // FILE: /tmp/crt/UDP-1197.ovpn
    int def_size[12] = 1930; // FILE: /tmp/crt/udp.group-1194-exp11nov.ovpn
    int def_size[13] = 31; // FILE: /tmp/crt/udp.group-1194.txt
    for(int i = 0; i < 14; i++) {
        struct stat st;
        stat(name[i], &st);
        int now = st.st_size;
        printf("VERIFYING: %s DEF_SIZE: %d NOW: %d\n", name[i], def_size[i], now);
        if (now != atoi(def_size[i])) {
            printf("(%s) has a different file size from the default one.\n", name[i]);
        }
    }


    return 0;
}

当我编译它时,我得到:

test.c: In function ‘main’:
test.c:26:17: warning: initializer-string for array of chars is too long
  char name[0] = "/tmp/crt/client.conf";
                 ^~~~~~~~~~~~~~~~~~~~~~
test.c:27:7: error: conflicting types for ‘name’
  char name[1] = "/tmp/crt/haha";
       ^~~~
test.c:26:7: note: previous definition of ‘name’ was here
  char name[0] = "/tmp/crt/client.conf";
       ^~~~
test.c:27:17: warning: initializer-string for array of chars is too long
  char name[1] = "/tmp/crt/haha";

我想要实现的是验证该数组中的每个文件,如果它与默认大小不匹配,则显示 printf 我应该如何修复它?

【问题讨论】:

  • 我建议你花一些时间阅读变量定义和初始化在 C 中是如何工作的。

标签: c arrays


【解决方案1】:

这个:

char name[0] = "/tmp/crt/client.conf";

意思是“使name成为一个0字符的数组,初始化这个20字符的字符串”。以此类推,这就是编译器发出警告的原因。

你的意思是:

const char *names[] = { "/tmp/crt/client.conf", ... };

这意味着“使names 成为指向不变字符数据的指针数组,初始化为指向这些以0 结尾的字符串”。后一个数组可以按照你的意愿进行迭代:

for(size_t i = 0; i < sizeof names / sizeof *names; ++i)
{
  printf("name %zu is '%s'\n", i, names[i]);
}

不过,更好的办法是将名称和尺寸存储在一起:

const struct {
  const char *name;
  size_t def_size;
} files[] = {
 { "/tmp/crt/client.conf", 5874 },
 { "/tmp/crt/haha", 1 },
 ... and so on ...
};

这将使stat()-loop 更易于编写:

for(size_t i = 0; i < sizeof files / sizeof *files; ++i) {
    struct stat st;
    if(stat(files[i].name, &st) == 0) {
      printf("VERIFYING: %s DEF_SIZE: %zu NOW: %zu\n", files[i].name, files[i].def_size, (size_t) st.st_size);
      if (st.st_size != files[i].def_size)
        printf("(%s) has a different file size from the default one.\n", files[i].name);
    }
}

【讨论】:

  • 如果我使用你的最后一个代码const struct { const char *name; 那么我如何比较文件大小?对不起,我是这种编程语言的新手,你也能写出如何比较它们吗?谢谢
  • 感谢您的澄清,但我注意到您在 files[i].size 中有一些错误,应该是 files[i].def_size 和另一个缺少的大括号在您的 if 语句中,无论如何谢谢:D
  • @hillz 我修正了错字,但不确定您对支架的意思。最里面的if 只有一个语句作为它的主体,所以括号被去掉了。
【解决方案2】:

改成:

char* name[] =
{
    "/tmp/crt/client.conf",
    "/tmp/crt/haha",
    "/tmp/crt/Router.ovpn",
    "/tmp/crt/Router.txt",
    "/tmp/crt/sgdo11-tcpvpn.com-443.ovpn",
    "/tmp/crt/sgdo1-tcpvpn.com-443.ovpn",
    "/tmp/crt/sshdropbear.net-2016-10-22.ovpn",
    "/tmp/crt/sshdropbear.net.txt",
    "/tmp/crt/tcpvpn.txt",
    "/tmp/crt/test15.ovpn",
    "/tmp/crt/test15.txt",
    "/tmp/crt/UDP-1197.ovpn",
    "/tmp/crt/udp.group-1194-exp11nov.ovpn",
    "/tmp/crt/udp.group-1194.txt",
};

int def_size[] =
{
    5874, // FILE: /tmp/crt/client.conf
       1, // FILE: /tmp/crt/haha
    2091, // FILE: /tmp/crt/Router.ovpn
      15, // FILE: /tmp/crt/Router.txt
    5694, // FILE: /tmp/crt/sgdo11-tcpvpn.com-443.ovpn
    2092, // FILE: /tmp/crt/sgdo1-tcpvpn.com-443.ovpn
    1779, // FILE: /tmp/crt/sshdropbear.net-2016-10-22.ovpn
      36, // FILE: /tmp/crt/sshdropbear.net.txt
      33, // FILE: /tmp/crt/tcpvpn.txt
    5855, // FILE: /tmp/crt/test15.ovpn
      26, // FILE: /tmp/crt/test15.txt
    4983, // FILE: /tmp/crt/UDP-1197.ovpn
    1930, // FILE: /tmp/crt/udp.group-1194-exp11nov.ovpn
      31, // FILE: /tmp/crt/udp.group-1194.txt
};

【讨论】:

  • 最好是const char* name[]
猜你喜欢
  • 2014-10-16
  • 2010-12-14
  • 2015-12-26
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多