我正在开发一个程序,该程序使用文件重定向来读取文件,每行读取一个字符,直到达到“ 0”,将字符存储在数组中,然后对该数组进行排序(从最大到最小)。无论如何,我真的只需要帮助阅读字符,直到出现零为止。以下是我正在阅读的文本文件:
f
k
s
j
p
a
v
r
t
u
h
m
g
e
b
y
n
z
w
l
i
x
q
c
o
d
0
下面是我到目前为止的代码:
int main(void)
{
int i=0;
char array[100];
while(fscanf(stdin, "%c", &array[i]) && array[i]!='0')
{
i++;
}
int N = (sizeof(array)/sizeof(array[0]));
for(i=0;i<N;i++)
{
printf("%c", array[i]);
}
return(0);
}
当我运行该程序时,它将打印出文件的每一行,包括零。它还在零之后打印出一些非常奇怪的字符(使用gcc编译器)。我在做什么错了?
答案 0 :(得分:2)
您需要将N
设置为i
的值,当前始终为100
答案 1 :(得分:1)
您使用i
来跟踪已阅读的项目数,然后覆盖循环中i
的值并打印出所有100个元素,无论您在其中存储了什么内容还是在其中不是。
使用与循环不同的变量来计数元素,并将计数用作循环极限。
int count=0;
char array[100];
while(fscanf(stdin, "%c", &array[count]) && array[count]!='0')
{
count++;
}
for(i=0;i<count;i++)
{
printf("%c", array[i]);
}
答案 2 :(得分:0)
fscanf需要跳过分隔符(输入或空格),否则它将被合并到您的列表中。添加空格可以解决此问题。
#include <stdio.h>
#include <stdlib.h>
int sort (const void *a,const void *b)
{
return ((int)*((unsigned char *)a)) - ((int)*((unsigned char *)b));
}
int main (void)
{
unsigned char array[100],i=0;
while (fscanf(stdin," %c", &array[i]) && array[i] != '0')
i++;
qsort (array,i,1,sort);
while (i)
printf ("%c\n", array[--i]);
}
该程序似乎排序错误,但是打印循环也恰好反向打印,因此可以很好地解决它。由于数组是无符号字符,因此排序例程将其强制转换为int
,以防止可能的溢出。