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