在C中填充字符串数组的正确方法是什么,这样每个字符串都是数组中的单个元素



我试图在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";

方法2:静态有界数组

这个方法就是你正在做的。您决定您的字符串必须短于指定的长度,并为它们预先分配足够大的缓冲区。在这种情况下,分配和更改字符串相对容易,但它们不能超过设置的长度。C代码:char my_string[MAX_STRING_LENGTH] = "Hello";

方法3:动态数组

这是最先进也是最危险的方法。在这里,您可以动态分配字符串,以便它们始终适合其内容。如果它们太大,你就调整大小。它们可以以多种方式实现(通常作为单个char指针,根据需要与方法2结合使用,偶尔作为链表)。

不管你如何实现字符串,在C语言的眼中,它们都只是字符数组。唯一需要注意的是,要使用标准库,您需要手动以空终止字符串(尽管许多[all?]]他们指定了通过手动指定长度来解决这个问题的方法)。

这就是为什么java字符串不是基本类型,而是String类型的对象。

有趣的是,对于这些解决方案,许多语言实际上使用不同的String类型。例如,Ada有StringBounded_StringUnbounded_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也有点令人困惑

相关内容

  • 没有找到相关文章

最新更新