linuxyz 发表于 2014-7-11 12:58:32

C-->scanf 求助

各位大神们帮看看
我的操作需要输入2个参数 一个int 一个字符串,
        printf ( "请选择打开文件的方式: " ) ;
        scanf( "%d", &num ) ;
        printf ( "请输入需要读/写的文件名称: " ) ;
        scanf( "%s", filename ) ;

但是在实际操作的时候字符串总是需要输入2次.

catch 发表于 2014-7-11 13:33:47

你有两个参数,不输入两次输几次?

linuxyz 发表于 2014-7-11 13:58:56

catch 发表于 2014-7-11 13:33
你有两个参数,不输入两次输几次?

sorry 估计我没描述清楚,我说的是输入了文件名后 回车, 还需要再输入一次文件名才行.

小甲鱼 发表于 2014-7-11 14:00:09

linuxyz 发表于 2014-7-11 13:58
sorry 估计我没描述清楚,我说的是输入了文件名后 回车, 还需要再输入一次文件名才行.

麻烦提供完整代码?

catch 发表于 2014-7-11 14:05:03

下面没有代码了?

linuxyz 发表于 2014-7-11 14:54:12

linuxyz 发表于 2014-7-11 13:58
sorry 估计我没描述清楚,我说的是输入了文件名后 回车, 还需要再输入一次文件名才行.

#include <stdio.h>

int fgetc_test () ;
char* chooseModel ( int ) ;

int main ( void )
{
        intnum ;
        char filename ;
        printf ( "1、(只读)为输入打开一个文本文件\n" ) ;
        printf ( "2、(只写)为输出打开一个文本文件\n" ) ;
        printf ( "3、(追加)向文本文件末尾增加数据\n" ) ;
        printf ( "4、(只读)为输入打开一个二进制文件\n" ) ;
        printf ( "5、(只写)为输出打开一个二进制文件\n" ) ;
        printf ( "6、(追加)向二进制文件末尾追加数据\n" ) ;
        printf ( "7、(读写)为读/写打开一个文本文件\n" ) ;
        printf ( "8、(读写)为读/写建立一个新的文本文件\n" ) ;
        printf ( "9、(读写)为读/写打开一个文本文件\n" ) ;
        printf ( "10、(读写)为读/写打开一个二进制文件\n" ) ;
        printf ( "11、(读写)为读/写建立一个新的二进制文件\n" ) ;
        printf ( "12、(读写)为读/写打开一个二进制文件\n\n" ) ;
        printf ( "请选择打开文件的方式: " ) ;
        scanf( "%d", &num ) ;
        printf ( "请输入需要读/写的文件名称: " ) ;
        scanf( "%s", filename ) ;
       
        fgetc_test ( filename, chooseModel ( num ) ) ;
        return 0 ;
}

int fgetc_test ( char filename, char model )
{
        FILE * fp ;
        char   ch ;
       
        scanf( "%s", filename ) ;
       
        if ( !( fp = fopen ( filename, model) ) )
        {
                printf ( "Can not open the file!\n" ) ;
                return 0 ;
        }
        while ( ch != EOF )
        {
                ch = fgetc ( fp ) ;
                putchar ( ch ) ;
        }
        fclose ( fp ) ;
        return 0 ;
}

char* chooseModel ( int num )
{
        switch ( num )
        {
                case 1:return "r" ;
                case 2:return "w" ;
                case 3:return "a" ;
                case 4:return "rb" ;
                case 5:return "wb" ;
                case 6:return "ab" ;
                case 7:return "rt+" ;
                case 8:return "wt+" ;
                case 9:return "at+" ;
                case 10: return "rb+" ;
                case 11: return "wb+" ;
                case 12: return "ab+" ;
                default: return "r" ;
        }
        return "r" ;
}

新手啊 麻烦了

linuxyz 发表于 2014-7-11 14:57:29

我知道哪问题了 麻烦大神们了..
不好意思 好低级的错误.

linuxyz 发表于 2014-7-11 14:58:45

我在fgetc_test方法中有个scanf没删除 唉.

流行语 发表于 2014-7-11 15:03:32

在fgetc_test中你又重新要求输入了一次。scanf( "%s", filename ) ;

疯狂战圣 发表于 2014-7-11 15:35:15

:titter:就是,还是小鱼厉害,不发完整的还看不出来,

linuxyz 发表于 2014-7-11 17:27:20

疯狂战圣 发表于 2014-7-11 15:35
就是,还是小鱼厉害,不发完整的还看不出来,

是是. 一直看都没看出来什么问题, 让我发代码的时候 发完我自己立马就看出来了 娃哈哈:lol:

haovcf 发表于 2014-7-12 10:17:46

主要问题出现在scanf() 函数中,获取第一个函数,1'\n' ,然后获取int 类型数据 1 ,然后'\n' 留在缓存区buffer 中,后输入名字。然后第二次scanf("%s",fileneme) ,filename获取 字符,实际上获取到的是\n’,表示filename 没有任何东西,然后丢弃掉,在输入一次才能 filenane 才能获得文件名,有问题请指出,共同进步。。
页: [1]
查看完整版本: C-->scanf 求助