C 使用printf时,换行符使字符串消失

C 使用printf时,换行符使字符串消失,c,C,我正在编写一个程序,它接收一个输入文件,该文件由哈希标记(a、B、C…)组成的字符图形组成,从控制台读取一个字符串,然后根据输入文件绘制字符,打印出该字符串 注意:如下所示,输入文件包含“.”而不是空格。在我的代码中,这些被替换为空格 由于某种原因,当我在绘制角色后打印换行符时,角色的片段会消失 我知道这听起来很复杂,所以我将提供下面的所有文件和输出 代码如下: #include <stdio.h> #include <stdlib.h> #include <str

我正在编写一个程序,它接收一个输入文件,该文件由哈希标记(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
循环:条件应该是
jUnrelated suggestion:code in English-always!几乎每一个程序员都懂它,如果你不懂,除了你的同胞之外,任何人都很难理解你的代码。(我是德国人,我讨厌看到德语代码!)你说得对。我以后会这样做。
redak[6]='\0'调用UB。当fgets自动执行作业时将其删除。如果(redak[0]='\n'| | redak[0]==32)继续,请尝试
if(redak[0]='\n'| | redak[0]==32){j--;continue;}
如果不起作用,尝试将
for(j=0;j<5;j++){for(i=0;ifor(i=0;i
我已经注释掉了那一行,但是输出仍然是一样的。问题不止这些。还有其他数组索引错误。
redak[6] = '\0';