【问题标题】:How to remove 0s from an array and assign the values into a jagged array in C如何从数组中删除 0 并将值分配给 C 中的锯齿状数组
【发布时间】:2020-02-02 09:23:13
【问题描述】:

我的代码最初用全零填充了一个多维 int 数组([20][20])。然后它从文件中读取数字并将其放回该数组中。它成功地从文件中放入数字。但是,有些 0 是我无法摆脱的。

我已经在线检查了锯齿状阵列的解决方案,但我做不到。


//fills the array
for( i = 0; i < 20 ; i++){
        for( j = 0; j < 20; j++){
                newString[i][j] = 0;
        }
}




j = 0;
ctr = 0;   //line number 
int m = 1,num = 1;
int spaceCounter = 0;
bool isMultiDigit = false;
while (fgets(line, sizeof(line), fp) != NULL){
        for(i=0;i<=(strlen(line));i++){
                if(line[i]==' '){
                        spaceCounter++;
                }
                else if(line[i]=='\n'){
                        j = 0;

                }
                else{
                        if(line[i] != '\0'){
                                if(line[i+1] == ' ' || line[i+1] == '\n' || line[i+1] == '\0'){
                                        if(isMultiDigit){
                                                newString[ctr][j] = num;
                                                num = 1;
                                                isMultiDigit = false;
                                        }
                                        else{
                                                printf("line[i] = %c. \n", line[i]);
                                                newString[ctr][j] = line[i] - '0';
                                                printf("newString[%d][%d] = %d\n", i,j, newString[ctr][j]);
                                        }

                                        j++;
                                }
                                else{
                                        if(!isMultiDigit) num = (line[i]-'0') * 10 + (line[i+1] - '0') ;
                                        else num = num * 10 + (line[i+1] - '0') ;
                                        isMultiDigit = true;
                                }
                        }
                }
                spaceCounter = 0;
        }

        ctr++;

}


for( i = 0; i < 20 ; i++){
        for( j = 0; j < 20; j++){
                printf("%d ", newString[i][j]);
        }
        printf("-------\n");
}

这是文件的内容

3
9 3 34 4 12 5 2
6 3 2 7 1
256 3 5 7 8 9 1

这是填充零然后从文件中读取后的输出

3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
9 3 34 4 12 5 2 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
6 3 2 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
256 3 5 7 8 9 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -------

所以在这种情况下,去掉 0 后的新数组将是

newArray[0] = {3} 
newArray[1] = {9, 3, 34, 4, 12, 5, 2} 
newArray[2] = {6, 3, 2, 7, 1} 
newArray[3] = {256, 3, 5, 7, 8, 9, 1} 

请提供代码片段来解决我的问题。 谢谢哟

【问题讨论】:

  • 如果您打印出一个 20x20 的网格,如果一行中没有 20 个元素,您认为会发生什么?
  • 您认为应该检查什么来决定何时停止?
  • 当你决定停止生产线时应该如何停止?
  • 您要打印不带零的newArray 吗?

标签: c arrays jagged-arrays


【解决方案1】:

修复您的代码后,我得到了如下所示的内容。我希望我得到的东西几乎是正确的。尽管如此,您的代码还是有几点。要将所有数组索引分配为零值,您不需要构建那个“for”循环。你可以这样做:

int newString[20][20] = { 0 };

对于您的情况,您构建了一个 20 x 20 的两级 int 数组。C 的数组长度不灵活。因此,无论它们的值是否为零,所有这些数组的索引都将保持不变。因此,如果您使用该类型的数组,则无法删除这些零。在您的情况下,如果您想保持这种风格,那么您必须在打印时验证值。我改为更改打印块。

您将来可以考虑的其他选项是指向由 malloc 或 hashmap 和类似数据结构定位的数组的指针数组。

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

int main(void) {
    int newString[20][20] = { 0 };
    int j = 0;
    int m = 1,num = 1;
    int ctr = 0;   //line number
    int spaceCounter = 0;
    char line[999];
    bool isMultiDigit = false;
    FILE *fp;

    if ( (fp = fopen( "test.txt", "r" )) == NULL ){
        printf( "Could not open file" ) ;
        return 1;
    }

    while (fgets(line, sizeof(line), fp) != NULL){
        for( int i=0; i<=(strlen(line));i++ ){
            if(line[i]==' '){
                spaceCounter++;
            } else if(line[i]=='\n'){
                j = 0;
            } else{
                if(line[i] != '\0'){
                    if(line[i+1] == ' ' || line[i+1] == '\n' || line[i+1] == '\0'){
                        if(isMultiDigit){
                            newString[ctr][j] = num;
                            num = 1;
                            isMultiDigit = false;
                        } else{
                            printf("line[i] = %c. \n", line[i]);
                            newString[ctr][j] = line[i] - '0';
                             printf("newString[%d][%d] = %d\n", i,j, newString[ctr][j]);
                        }

                        j++;
                    } else {
                        if(!isMultiDigit) num = (line[i]-'0') * 10 + (line[i+1] - '0');
                        else num = num * 10 + (line[i+1] - '0') ;
                        isMultiDigit = true;
                    }
                }
            }
            spaceCounter = 0;
        }
        ctr++;
    }

    for( int i = 0; i < 20 ; i++){
        if ( newString[i][0] == 0 ) continue;
        for( int j = 0; j < 20; j++){
            if ( newString[i][j] != 0 ) printf("%d ", newString[i][j]);
        }
        printf("-------\n");
    }
}

我手头有一些空闲时间。因此,我包含了第二个代码,其中使用了动态长度 int 数组。该代码几乎与您的代码完全相同,只是数据类型结构不同。此外,当您将一个您确定为数字的 ASCII 码的 char 转换为 int 值时,您可以使用“char ^ 48”而不是“char - '0'”。

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>

/*
 * An example of a data structure
 * that can hold dynamic length
 * int arrays. 
 */
struct arrayInt {
    int *value;
    int length;
    int size;
};

/*
 * Locating and return an array int structure
 * with its size and its value array to the de
 * defined size.
 */
struct arrayInt newArrayInt( const int size ){
    struct arrayInt output;
    output.value = (int*) malloc(size * sizeof(int));
    output.length = 0;
    output.size = size;
    return output;
}

int main(void) {
    struct arrayInt newString[20];
    int j = 0;
    int m = 1,num = 1;
    int ctr = 0;   //line number
    int spaceCounter = 0;
    char line[999];
    bool isMultiDigit = false;
    FILE *fp;

    if ( (fp = fopen( "test.txt", "r" )) == NULL ){
        printf( "Could not open file" ) ;
        return 1;
    }

    // Locating dynamic length int arrays
    for ( int i = 0; i < 20; i++ ){
        newString[i] = newArrayInt(20);
    }

    while (fgets(line, sizeof(line), fp) != NULL){
        for( int i=0; i<=(strlen(line));i++ ){
            if(line[i]==' '){
                spaceCounter++;
            } else if(line[i]=='\n'){
                j = 0;
            } else{
                if(line[i] != '\0'){
                    if(line[i+1] == ' ' || line[i+1] == '\n' || line[i+1] == '\0'){
                        if(isMultiDigit){
                            newString[ctr].value[j] = num;
                            // Keep track of length
                            newString[ctr].length++;
                            num = 1;
                            isMultiDigit = false;
                        } else{
                            printf("line[i] = %c. \n", line[i]);
                            newString[ctr].value[j] = line[i] - '0';
                            // Keep track of length
                            newString[ctr].length++;
                             printf("newString[%d].value[%d] = %d\n", i,j, newString[ctr].value[j]);
                        }

                        j++;
                    } else {
                        if(!isMultiDigit) num = (line[i]-'0') * 10 + (line[i+1] - '0');
                        else num = num * 10 + (line[i+1] - '0') ;
                        isMultiDigit = true;
                    }
                }
            }
            spaceCounter = 0;
        }
        ctr++;
    }

    for( int i = 0; i < 20 ; i++){
        if ( newString[i].length == 0 ) continue;
        for( int j = 0; j < newString[i].length; j++){
            printf("%d ", newString[i].value[j]);
        }
        printf("-------\n");
    }

    // free memory
    // Probably unnecessary.
    for ( int i = 0; i < 20; i++ ){
        free(newString[i].value);
        newString[i].length = 0;
        newString[i].size = 0;
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多