c - 为什么在 C 中打印 char 类型的二维数组时会出现 UB?

标签 c arrays string multidimensional-array char

我只是尝试使用指针打印一串字符,但输出不正确。有人能告诉我为什么吗?方法 display_chunks() 用于打印数组中除第一个字符之外的每个字符串。但是,尽管我在打印字符串中的最后一个字符后递增了指针变量,但似乎打印了同一行。

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

//macros: constants
#define CHUNK_LENGTH (20+1)  //each chunk has twenty characters, we add 1 so
                           //there is space for the null terminator.
#define NUMBER_OF_CHUNKS 4 //the message is spread across 4 chunks.
void display_chunks();

char chunks[NUMBER_OF_CHUNKS][CHUNK_LENGTH];

int main(){
strcpy(chunks[0], "2i1%fsi%fs%jstwrtzx%");
strcpy(chunks[1], "1'H%nx%vznwp~1%kqf|j");
strcpy(chunks[2], "4R3%Wnyhmnj%%%%%%%%%");
strcpy(chunks[3], "3xzhhjxx3'%2%Ijssnx%");
    display_chunks();
}

void display_chunks() {
    int i, j;
    char *arr = chunks[0];
    for(i = 0; i < NUMBER_OF_CHUNKS; i++){
        for(j = 1; j < CHUNK_LENGTH-1; j++){
            printf("%c", *(arr+j));
        }
        ++arr;
        printf("\n");
    }
}

这是我的输出:

i1%fsi%fs%jstwrtzx%
1%fsi%fs%jstwrtzx%
%fsi%fs%jstwrtzx% 1
fsi%fs%jstwrtzx% 1'

编辑克雷格的回答;我似乎不明白指针和双指针之间的区别。我之前尝试的是递增 arr,因为我假设它会指向 chunks 中的下一个数组。看起来我错了,我花了一段时间才弄清楚。

抱歉,C 新手:)

最佳答案

你有两个问题。

j 的 for 循环从 1 而不是 0 开始。

并且,arr 始终是 chunks[0] 而不是 chunks[i]

修改后的代码:

strcpy(chunks[0], "2i1%fsi%fs%jstwrtzx%");
strcpy(chunks[1], "1'H%nx%vznwp~1%kqf|j");
strcpy(chunks[2], "4R3%Wnyhmnj%%%%%%%%%");
strcpy(chunks[3], "3xzhhjxx3'%2%Ijssnx%");

void display_chunks() {
    int i, j;
    for(i = 0; i < NUMBER_OF_CHUNKS; i++){
        char *arr = chunks[i];
        for(j = 0; j < CHUNK_LENGTH-1; j++){
            printf("%c", *(arr+j));
        }
        printf("\n");
    }
}

更新:

根据您的原始代码 [没有显示 chunks 的声明],arr = chunks[i] 的使用是必要的,因为可能使用了以下之一:

char *chunks[NUMBER_OF_CHUNKS];
char chunks[NUMBER_OF_CHUNKS][CHUNK_LENGTH];

既然已知会使用后者,那么可以使用 arr 的增量对原始代码进行变体:

strcpy(chunks[0], "2i1%fsi%fs%jstwrtzx%");
strcpy(chunks[1], "1'H%nx%vznwp~1%kqf|j");
strcpy(chunks[2], "4R3%Wnyhmnj%%%%%%%%%");
strcpy(chunks[3], "3xzhhjxx3'%2%Ijssnx%");

void display_chunks() {
    int i, j;
    char *arr = chunks[0];
    for(i = 0; i < NUMBER_OF_CHUNKS; i++){
        for(j = 0; j < CHUNK_LENGTH-1; j++){
            printf("%c", arr[j]));
        }
        arr += CHUNK_LENGTH;
        printf("\n");
    }
}

样式清理可能是:

strcpy(chunks[0], "2i1%fsi%fs%jstwrtzx%");
strcpy(chunks[1], "1'H%nx%vznwp~1%kqf|j");
strcpy(chunks[2], "4R3%Wnyhmnj%%%%%%%%%");
strcpy(chunks[3], "3xzhhjxx3'%2%Ijssnx%");

void display_chunks() {
    int i, j;
    char *arr = chunks[0];
    for(i = 0; i < NUMBER_OF_CHUNKS; i++, arr += CHUNK_LENGTH){
        for(j = 0; j < CHUNK_LENGTH-1; j++){
            printf("%c", arr[j]));
        }
        printf("\n");
    }
}

关于c - 为什么在 C 中打印 char 类型的二维数组时会出现 UB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44863947/

相关文章:

php - 如何将可变数量的参数传递给 sprintf() 函数?

c - 这两个表达之间有区别吗?

c - 如何在sublime text 2中编译并运行C而不创建exe文件

c - 对于 C 来说真的很陌生,在这个基本代码上遇到了麻烦

c - 使用 HMAC() 函数后释放内存吗?

javascript - Node js中唯一的json数据对象

java - Android 中的 for 循环在项目之间创建间隙

Java模拟键盘

arrays - 获取枚举数组的基数组

c++ - 如何在for循环中用多个字符组成一个字符串