gpt4 book ai didi

C - 字符串数组和函数

转载 作者:太空宇宙 更新时间:2023-11-04 06:10:25 26 4
gpt4 key购买 nike

所以我一直在学习 C,并且对字符串数组和指针感到非常困惑。
我试图将一个数组传入 buildArrays 并填充它并在 main 中使用它。当我在 buildArrays 末尾打印数组时,它打印正常,但是当我在 main 函数末尾打印它时,索引 0 字符串打印正常,然后其余的都关闭。

void buildArrays(char *fileName, char wordArray[][50], char gridArray[][50],int columnCounter, int rowCounter ) {

FILE *dat2; // Create File objects for input and output file .
dat2 = fopen(fileName, "r");

char mystring[columnCounter * 3];
int c, columnIndex = 0, rowIndex =0;
while(fgets(mystring, (columnCounter * 3), dat2) != NULL) {

// printf("Line: %s\n",mystring);
// printf("rowIndex: %d - rowCounter: %d\n", rowIndex, rowCounter);
// printf("...\n");

if(rowIndex < rowCounter){
strcpy(gridArray[rowIndex], mystring);
//printf("GridArray: %s\n", gridArray[rowIndex]);
}
rowIndex++;
}
for(int b=0; b<rowCounter; b++)
{
printf("%s\n", gridArray[b]);
}

}


int main(void)
{
int rowCounter, columnCounter , wordCounter= 0;
char fileName[100] = "data1";
getArraySize(fileName, &columnCounter, &rowCounter, &wordCounter);
printf("%d x %d", columnCounter, rowCounter);
printf("Number of words: %d", wordCounter);
printf("\n");

char wordArray[wordCounter][columnCounter + 1];
char gridArray[columnCounter][rowCounter * 2];

buildArrays(fileName, wordArray, gridArray, columnCounter, rowCounter);

for(int b=0; b<rowCounter; b++)
{
printf("%s\n", gridArray[b]);
}



}

buildArrays 打印

S T E L B M T F E Y D E E P S R T C I A E E

N N E L I T R L B D E T A R E M U N E T Y L

N O I T A N I M I R C N I F L E S S E N T A

A U I D E W A R R A N T N U P R U S S E R P

P G S G E A L P A P B A N P S A S S N M E A

C O N S I T U T I O N D E E C W S O O H P D

S V W D E L A N E E J A M E S M A D I S O N

A E D E S N E G R J C U L T N O H L T I R A

A R C E R R T R E E S B O N E E I D N N P R

S N J U D I C I A L A S S E C O R P E U D I

S M R A R A E B W B E S S M E O A U V P E M

O E O I A I L N O U C D O D S S E N N I G R

L N I D G Y T R C O M P E N S A T I O N N D

D T O Z E H P Y N D R L E E A O H S C O I B

I T P S U E T G O L U Z M M R B E H P I R T

E O I E A R R S U U I B H A Y L L M S T F A

R I N R E E E F U T L V Q U A R T E R I N G

S I D B S R R D I Y E N I G M I A N A T I R

S Q I S E B S C N S P E E C H R O T A E Y N

D L C M I L I T I A F L R N C A T S S P S E

R U T E D Y L E B I L C O H M L E T E S Y Y

L S T R T E W Z L I O S A E N S A E I Y A L

主要打印

S T E L B M T F E Y D E E P S R T C I A E E

T Y L

S S E N T A

U P R U S S E R P

B A N P S A S S N M E A

T I O N D E E C W S O O H P D

E L A N E E J A M E S M A D I S O N

E D E S N E G R J C U L T N O H L T I R A


P R

P E U D I

E O A U V P E M

D O D S S E N N I G R

C O M P E N S A T I O N N D

H P Y N D R L E E A O H S C O I B

P S U E T G O L U Z M M R B E H P I R T


A

R I N G

I A N A T I R

最佳答案

您在 main 中定义的数组与 buildArrays 不匹配期望。 main中的第二个维度是动态的,通常不是 50 ,但是buildArrays总是假设它是 50 .这就是为什么你的结果很奇怪; gridArray[b]指代内存中的某个地方b * rowCounter * 2 gridArray 的第一个字节之后的字节在main , 但它指的是内存 b * 50 buildArrays 中第一个字节之后的字节.

您看到它仅在 b 的第二个和后续值上表现不正常(因为 b0 将一直乘以 0)。但是当b1 , buildArrays正在填充字节 50-100(尽管它实际上将大部分保留为 NUL s),而 main正在读取字节 rowCounter * 2直到它达到 NUL字节。对于 b1 ,我猜它试图查看以 NUL 开头的位置(因此缺少输出),但最终还是有一些 b * rowCounter * 2回绕到非 NUL文本,跳过:

N N E L I T R L B D E T A R E M U N E

部分:

N N E L I T R L B D E T A R E M U N E T Y L

并且只打印最后的:

T Y L

在它看到 NULL 之前并停止。

要点是,多维数组的第二维和后续维很重要;第一个维度没有(函数只是将其作为指针接收),但必须知道所有后续维度以确定如何解释该指针的索引。

关于C - 字符串数组和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58292529/

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