C 声明2d字符数组?

C 声明2d字符数组?,c,C,是否可以这样声明二维数组: char words[128][25]; 然后仅按如下方式分配给它: int i=0; while(fscanf(fp,"%s" words[i++]) != EOF){ printf("Copied"); } 我在一段代码中看到过它,不理解,所以尝试了一下,当它试图运行这行代码时,代码块崩溃了。当数组被这样声明时,它是一种完全无效的使用方法吗?它编译得很好,只是不运行。这是使用数组的合法方式;问题似乎出现在您的while中: while(fscanf

是否可以这样声明二维数组:

char words[128][25];
然后仅按如下方式分配给它:

int i=0;

while(fscanf(fp,"%s" words[i++]) != EOF){  
 printf("Copied");
}  

我在一段代码中看到过它,不理解,所以尝试了一下,当它试图运行这行代码时,代码块崩溃了。当数组被这样声明时,它是一种完全无效的使用方法吗?它编译得很好,只是不运行。

这是使用数组的合法方式;问题似乎出现在您的while中:

while(fscanf(fp,"%s words[i++]) == EOF){

您只需要在
%s

后面加上一个结束引号和逗号,这是使用数组的合法方式;问题似乎出在您的while中:

while(fscanf(fp,"%s words[i++]) == EOF){

您只需要在
%s

后面加上结束引号和逗号,以及raptor解释的内容, 当等于EOF时,也可以循环。。 这意味着您将永远无法获得“复制的”,除非文件为空。。 你可能是说:

while(fscanf(fp,"%s",words[i++]) != EOF){  
 printf("Copied");
}  
  • 编辑:

参考Whoz评论,这确实是一个危险的代码,如果您的代码中的行数超过了用词初始化的行数,那么您将得到一个异常,除此之外,我确实会说明提取的行数(-1)

以及raptor解释的内容, 当等于EOF时,也可以循环。。 这意味着您将永远无法获得“复制的”,除非文件为空。。 你可能是说:

while(fscanf(fp,"%s",words[i++]) != EOF){  
 printf("Copied");
}  
  • 编辑:

参考Whoz注释,这确实是一个危险的代码,如果您的代码中的行数超过了用单词初始化的行数,那么您将得到一个异常,除此之外,我确实会说明提取的行数(或单词数)(-1)

请给我们看一些可编译的代码。请给我们看一些可编译的代码。请注意,当此中断时,
i
将比成功扫描的字符串数多出一个。@WhozCraig:谢谢,在我的回答中添加了更多的解释(或者更确切地说是警告),我可能应该详细说明。想象一个只有一个单词的文件。第一次迭代将把单词读入
words[0]
,并将
i
增加到1,并且不返回EOF。第二次迭代将无法将一个单词读入
单词[1]
,并将
i
增加到2,然后返回EOF,从而中断循环。底线:不管发生什么,这都将以
i
结束,反映出比成功解析的字符串的实际数量大一个。另一个例子是,如果在一个空文件上调用它,它将是
1
(我希望这是显而易见的原因)。应该注意,当它中断时,
I
将比成功扫描的字符串数大一个。@WhozCraig:谢谢,在我的回答中添加了更多的解释(或者更确切地说是警告),我可能已经详细说明了。想象一个只有一个单词的文件。第一次迭代将把单词读入
words[0]
,并将
i
增加到1,并且不返回EOF。第二次迭代将无法将一个单词读入
单词[1]
,并将
i
增加到2,然后返回EOF,从而中断循环。底线:不管发生什么,这都将以
i
结束,反映出比成功解析的字符串的实际数量大一个。另一个例子是,如果在一个空文件上调用它,它将是
1
(我希望这是显而易见的原因)。@icepack我刚刚尝试了这个,GCC和Clang都没有抛出警告,甚至这个
-pedantic-Wall-Wextra
。对我来说,它似乎完全有效。是的,缺少逗号,==不!=只是我打字不好写的问题!所以这是使用数组的一种有效方法,这正是我想知道的。@icepack我刚刚尝试了这个方法,GCC和Clang都没有发出警告,甚至这个
-pedantic-Wall-Wextra
。对我来说,它似乎完全有效。是的,缺少逗号,==不!=只是我打字不好写的问题!所以这是使用数组的一种有效方法,这就是我想知道的。