gpt4 book ai didi

c - 使用 printf 时,换行符会使字符串消失

转载 作者:太空宇宙 更新时间:2023-11-03 23:45:23 24 4
gpt4 key购买 nike

我正在编写一个程序,它接受一个输入文件,该文件由由主题标签(A、B、C...)组成的字符图组成,从控制台读取一个字符串并通过根据绘制字符打印出该字符串到输入文件。

注意:正如您将在下面看到的,输入文件包含“.”而不是空格。这些在我的代码中被替换为空格。

出于某种原因,当我在绘制字符后打印换行符时,字符的一部分消失了。

我知道这听起来很复杂,所以我将在下面提供所有文件和输出。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef struct{
char znak[5][5 + 1];
} slovo;

void napuni(slovo *znakovi, FILE *ulaz);

int main(){
int i,j;
FILE *ulaz = fopen("ascii.in", "r");
slovo *znakovi = calloc(27, sizeof(slovo));
napuni(znakovi, ulaz);
fclose(ulaz);
FILE *izlaz = fopen("ascii.out", "w");
char *tekst = calloc(50,sizeof(char));
fgets(tekst,50,stdin);
char *znak = strchr(tekst, '#');
*znak = '\0';
int duljina = strlen(tekst);
for (j = 0; j < 5; j++){
for (i = 0; i < duljina; i++){
int znak2 = toupper(tekst[i]) - 65;
fprintf(izlaz, "%s", znakovi[znak2].znak[j]);
}
fprintf(izlaz,"\n");
}
fclose(izlaz);
return 0;
}

void napuni(slovo *znakovi, FILE *ulaz){
char redak[6];
int i,j;
for (i = 0; i < 27; i++){

for (j = 0; j < 7; j++){
if (feof(ulaz)) break;
fgets(redak,6,ulaz);
if (redak[0] == '\n' || redak[0] == 32) continue;
char *znak = strchr(redak, '.');
while(znak != NULL){
*znak = 32;
znak = strchr(redak,'.');
}
strcpy(znakovi[i].znak[j], redak);
printf("\n%s",znakovi[i].znak[j]); // this line prints the character to console for testing
}
printf("\n"); //when this line is uncommented pieces of the character disappear
}
}

这是输入文件:

..#..
.#.#.
.###.
.#.#.
.#.#.

.##..
.#.#.
.##..
.#.#.
.##..

..#..
.#.#.
.#...
.#.#.
..#..

.##..
.#.#.
.#.#.
.#.#.
.##..

.###.
.#...
.##..
.#...
.###.

.###.
.#...
.##..
.#...
.#...

..#..
.#...
.#.##
.#..#
..##.

.#.#.
.#.#.
.###.
.#.#.
.#.#.

..#..
..#..
..#..
..#..
..#..

...#.
...#.
...#.
.#.#.
..#..

.#.#.
.#.#.
.##..
.#.#.
.#.#.

.#...
.#...
.#...
.#...
.###.

#...#
##.##
#.#.#
#...#
#...#

#..#.
##.#.
#.##.
#..#.
#..#.

..#..
.#.#.
.#.#.
.#.#.
..#..

.##..
.#.#.
.##..
.#...
.#...

..#..
.#.#.
.#.#.
.#.#.
..##.

.##..
.#.#.
.##..
.##..
.#.#.

..##.
.#...
.###.
...#.
.##..

.###.
..#..
..#..
..#..
..#..

.#.#.
.#.#.
.#.#.
.#.#.
.###.

.#.#.
.#.#.
.#.#.
.#.#.
..#..

#...#
#...#
#.#.#
#.#.#
.#.#.

#...#
.#.#.
..#..
.#.#.
#...#

.#.#.
.#.#.
.###.
...#.
..##.

.###.
...#.
..#..
.#...
.###.

..#..
.#.#.
...#.
..#..
..#..

当我不在中间插入换行符时,这是一个测试输出(一次只打印出每个字符):

  #
# #
###
# #
# #
##
# #
##
# #
##
#
# #
#
# #
#
##
# #
# #
# #
##
###
#
##
#
###
###
#
##
#
#
#
#
# ##
# #
##
# #
# #
###
# #
# #
#
#
#
#
#
#
#
#
# #
#
# #
# #
##
# #
# #
#
#
#
#
###
# #
## ##
# # #
# #
# #
# #
## #
# ##
# #
# #
#
# #
# #
# #
#
##
# #
##
#
#
#
# #
# #
# #
##
##

如您所见,它的行为符合预期。但是,如果我在两者之间插入一个换行符,字符就会被破坏。见下文:

  #
# #
###
# #

# #
##
# #

##
# #
##

#
# #
#

# #
#
##

# #
# #
# #
##

###
#
##

#
###
###

#
##
#

#
#
#

# ##
# #
##

# #
# #
###
# #

# #
#
#

#
#
#

#
#
#

# #
#
# #

# #
##
# #
# #

#
#
#

#
###
# #

## ##
# # #
# #

# #
# #
## #

# ##
# #
# #

#
# #
# #
# #

#
##
# #

##
#
#

#
# #
# #

# #
##
##

基本上就是这样。我是 C 语言的初学者,因此非常感谢您的帮助。

最佳答案

您的代码中存在缓冲区溢出错误。你声明redak作为:

char redak[6];

然后用这一行覆盖它末尾的内存:

redak[6] = '\0';

结果是未定义的行为。请注意,像 valgrind 这样的工具将有助于轻松捕获此类错误。

另一个问题是你的 for循环:条件应该是j<6而不是 7。

最后,redak应该是 7 号和 fgets()相应地改变了。否则fgets没有读入换行符,所以你从错误的位置开始阅读“下一行”。请记住 fgets最多读取小于 size 个字符。

这一切也意味着 char znak[5][5 + 1]应该改为char znak[6][7] .

关于c - 使用 printf 时,换行符会使字符串消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34704387/

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