3

我正在编写一个解密程序,我需要扫描未知数量的字符串并在输入每个字符串时对其进行解码。程序必须在到达 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;
}
4

3 回答 3

4
while (scanf("%s", code) == 1)
{
    // no need for second scanf call
    ...
于 2013-04-07T18:41:33.597 回答
0
while (scanf("%c", &code[0]) == 1)
{   scanf("%s", &code[1]);
    ...
于 2013-04-07T18:31:41.823 回答
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 */
}

不用担心一次读一个字符效率低;缓冲会解决这个问题。

于 2013-04-07T18:46:53.463 回答