gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:02:49 24 4
gpt4 key购买 nike

我只是尝试使用指针打印一串字符,但输出不正确。有人能告诉我为什么吗?方法 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com