【问题标题】:Beginning C program freezing at scanf开始 C 程序在 scanf 处冻结
【发布时间】:2012-02-26 04:56:17
【问题描述】:

我遇到了 scanf 冻结的问题。我环顾四周,虽然有些问题很相似,但它们并没有帮助解决我的问题。

main(int argc, char **argv) {
//FILE *stream = stdin;
if (stdin == NULL) {
    printf("Could not open file");
    return 0;
}
int exists = 0;
char letter;
char next = 'H';
char word[30];
int frequency = -1;
int sample = -1;
char  *channels;
channels=malloc(sizeof(7*sizeof(char)));
int bitres = -1;
int secondE = 0;


while (exists == 0) {
    scanf("%c", &letter);   //this is the problem, possibly scanf
    printf("AFTER");
    if (letter == EOF) {
    //  printf(letter);
        printf("HEADER NOT DETECTED");
        return 0;
    }

我已经使用 printf 查明了问题所在。我目前正在通过命令提示符将另一个文件导入该程序。当我到达 scanf 它只是挂起。如果有人知道解决方案,我将非常感激。

顺便说一句,使用 scanf 是不好的做法吗?将 stdin 分配给文件指针同样容易(实际上我已将其注释掉),但 scanf 似乎同样容易。

【问题讨论】:

  • 必须使用scanf()吗?它通常很难使用,尤其是对于初学者。您是否尝试过fgetc()?此外,scanf() 永远不会以这种方式返回 EOF 值(fgetc() 会)。
  • 你说它挂起是什么意思..?您连续按任意键但没有任何反应或 prntf("AFTER") 连续打印..?
  • 它永远不会到达“之后”。但是,如果我在 scanf 之前放置一个 printf 语句,该语句将打印出来。

标签: c


【解决方案1】:

冻结是什么意思。我运行这段代码。当您的代码到达scanf 时,它会等待您的输入。你提供一些输入,然后看看会发生什么。

scanf 不是一个坏习惯

channels=(char*)malloc(sizeof(7*sizeof(char)));
int bitres = -1;
int secondE = 0;


while (exists == 0) 
{
    scanf("%c", &letter);   // ok
    printf("AFTER");
    printf("\n");
    printf("%c", letter);
    printf("\n");
    if (letter == EOF) {
    //  printf(letter);
     printf("HEADER NOT DETECTED"); }
    return 0;
}

scanf 也永远不会返回 EOF。

【讨论】:

  • 我正在输入一个包含文本的文件。管道将导致文件成为标准输入,不是吗?如果是这样,scanf 应该读取 stdin 的第一个字符(我输入的文件中文本的第一个字符)。
  • 管道是什么意思?如果您将文件名作为命令行参数提供,那么它不会像标准输入中的文件那样受到威胁。它只是一个简单的参数。
  • 我正在使用命令行。我的输入如下所示:filetobepipe |程序imshowingyouonstackoverflow
  • 命令行参数传递可以看[cprogramming.com/tutorial/c/lesson14.html]
  • 我只用 C 语言编程了四分之一个多世纪,我发现 scanf() 很难可靠地使用,所以我没有。我将使用fgets() 读取行并使用sscanf() 解析它们;根据我的经验,这更容易正确处理(并且也更容易报告错误!)。您应该始终检查 scanf() 返回您希望它转换的值的数量;如果遇到 EOF,它可以返回 -1。如果有数据但与格式不匹配(例如,下一个字符是字母但您正在尝试扫描数字),则它可以返回 0。
【解决方案2】:
while (exists == 0) 
{
    scanf("%c", &letter);   // ok
    printf("AFTER");
    printf("\n");
    printf("%c", letter);
    printf("\n");
    if (letter == EOF) {
    //  printf(letter);
     printf("HEADER NOT DETECTED"); }
    return 0;
}

所以当使用这个

if (letter == E0F) 

上面的部分有点太字面了。为什么不只使用 char 来存储您想要的答案并使用以下内容来创建

if(strcmp(letter, *desired char here*) == 0){

只是一个猜测,考虑到如果您的 scanf 函数仅在调试时冻结,它可能是客户端,但对于上面的示例,它在阅读代码时更加用户友好,并且在处理其他字符时不会出现任何错误稍后在您的程序中使用整数。取决于你想用它完成什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2011-12-03
    • 2017-10-03
    • 2015-07-28
    • 2022-11-08
    • 2021-12-04
    • 2018-09-01
    相关资源
    最近更新 更多