我试图在C中初始化字符串的2D数组;它似乎不像我编写过的其他语言那样工作。我要做的是,读取输入,并从输入中取出所有的注释并将它们存储在2d数组中,其中每个字符串将是数组中的新行。当我到达下一行的字符时,我想推进数组的第一个索引,以便我可以分隔每个"注释字符串"。ie。
char arr[100][100];
<whatever condition>
arr[i][j] = "//First comment";
当我到达'/n'时,我想增加第一个索引,这样:
arr[i+1][j] = "//Second comment";
我只是希望能够访问每个输入作为一个单独的元素在我的数组。在Java中,我不需要这样做,因为每个字符串已经是string数组中的单个元素。到现在为止,我只使用了3个星期的c,而我过去认为理所当然的简单的事情,在c中已经被证明是相当令人沮丧的。
我的实际代码如下。它给了我一个无限循环并打印出大量的数字:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int MAXLENGTH = 500;
int main(){
char comment[MAXLENGTH][MAXLENGTH];
char activeChar;
int cIndex = 0;
int startComment = 0;
int next = 0;
while((activeChar = getchar()) != EOF){
if(activeChar == '/'){
startComment = 1;
}
if(activeChar == 'n'){
comment[next][cIndex] = ' ';
next++;
}
if(startComment){
comment[next][cIndex] = activeChar;
cIndex++;
}
}
for(int x = 0 ; x < MAXLENGTH; x++){
for (int j = 0; j < MAXLENGTH; j++){
if(comment[x][j] != 0)
printf("%s", comment[x][j]);
}
}
return 0;
}
您遇到的问题是,C被设计为本质上是一个美化的汇编程序。这意味着它唯一"内置"的东西是那些有明显正确方法的东西。字符串不满足此标准。因此,字符串在c中不是一阶公民。
特别是至少有三种可行的方法来处理字符串,C并不强制你使用其中的任何一种,而是允许你使用你想要的方法来处理手头的工作。
方法1:静态数组
这个方法看起来和你要做的很相似,并且经常被新的C程序员使用。在这个方法中,字符串只是一个长度刚好适合其内容的字符数组。赋值数组变得很困难,因此这促进了将字符串用作不可变变量。这似乎是大多数JVM实现字符串的方式。C代码:char my_string[] = "Hello";
这个方法就是你正在做的。您决定您的字符串必须短于指定的长度,并为它们预先分配足够大的缓冲区。在这种情况下,分配和更改字符串相对容易,但它们不能超过设置的长度。C代码:char my_string[MAX_STRING_LENGTH] = "Hello";
方法3:动态数组
这是最先进也是最危险的方法。在这里,您可以动态分配字符串,以便它们始终适合其内容。如果它们太大,你就调整大小。它们可以以多种方式实现(通常作为单个char指针,根据需要与方法2结合使用,偶尔作为链表)。
不管你如何实现字符串,在C语言的眼中,它们都只是字符数组。唯一需要注意的是,要使用标准库,您需要手动以空终止字符串(尽管许多[all?]]他们指定了通过手动指定长度来解决这个问题的方法)。
这就是为什么java字符串不是基本类型,而是String
类型的对象。
String
、Bounded_String
和Unbounded_String
用于上述三种方法。
<标题> 解决方案再看一遍你的代码:char arr[100][100];
哪个方法是this,它是什么?
显然是MAX_STRING_LENGTH
为100的方法2。所以你可以假装这行说:my_strings arr[100]
,这使你的问题很明显,这不是一个2D字符串数组,而是一个2D字符数组,它代表一个1D字符串数组。要在C中创建一个2D字符串数组,您可以使用:char arr[WIDTH][HEIGHT][MAX_STRING_LENGTH]
,这很容易出错。然而,如上所述,您的代码中有一些逻辑错误,您可能只需要一个1D字符串数组就可以解决这个问题。(2D字符数组)
comment是一个2D字符数组,它是单个字符。在C语言中,字符串只是一个字符数组,因此注释的定义是定义一维字符串数组的一种方式。
就加载而言,唯一明显的潜在问题是您从未将startComment重置为零(但您应该使用调试器来确保正确加载),但是打印它的代码是错误的。
使用带有%s的printf()告诉它从你给它的任何地址开始打印字符串,但是你给它的是单个字符,而不是整个字符串,所以它将每个字符串中的每个字符(因为C是一种非常非常可怕的语言)解释为RAM中的地址,并试图打印该RAM。要打印单个字符,请使用%c而不是%s。或者,创建一个1D for循环:
for(int x=0; x<MAX_LENGTH; X++)
printf("%sn", comment[x])
对于数组中的行数和每行中字符串的长度使用相同的MAX_LENGTH也有点令人困惑