我正在编写一个解密程序,我需要扫描未知数量的字符串并在输入时解码每个字符串。程序必须在达到EOF后结束。
我很难让程序结束。当我在我的while循环条件语句中扫描字符串中的第一个字符时,它正在执行此操作但是当我在实际字符串中扫描条件语句时,字符串缺少第一个字符。我应该扫描第一个字符,然后以某种方式将该字符串放在字符串的开头?
如何在我的情况下正确测试EOF?
#include <stdio.h>
#include<string.h>
int main(void)
{
int i;
char code[300];
while(scanf("%c", &code[0])!=EOF)
{
scanf("%s", code);
for(i=0; i<strlen(code); i++)
{
decrypt message one char at a time
}
printf("\n");
}
return 0;
}
答案 0 :(得分:3)
while (scanf("%s", code) == 1)
{
// no need for second scanf call
...
答案 1 :(得分:0)
while (scanf("%c", &code[0]) == 1)
{ scanf("%s", &code[1]);
...
答案 2 :(得分:0)
使用scanf
根本不是这个特定问题的主意。
while(scanf("%c", &code[0])!=EOF)
此scanf
调用会读取单个字符。只需使用getchar()
。
scanf("%s", code);
for(i=0; i<strlen(code); i++)
{
decrypt message one char at a time
}
scanf
调用可以读取任意多个字符(在跳过空格后;你确定要跳过空格吗?)。这意味着如果从stdin
读取的字符太多,则会出现缓冲区溢出,除非您完全控制stdin
上显示的内容,否则无法避免。
然后循环遍历code
数组,为您处理的每个字符调用strlen()
。由于strlen()
通常必须从数组的开头扫描到终止'\0'
,因此这是低效的。 如果您需要遍历字符串的字符,请调用strlen()
一次并保存该值,或者查找终止'\0'
字符。
但是你一次只处理一个角色,所以一次只能读取一个角色:
while ((c = getchar()) != EOF) {
/* process a character */
}
不要担心一次阅读一个字符效率低下;缓冲将照顾到这一点。