让用户输入名称但使用文件流* fp

时间:2017-06-12 08:49:40

标签: c

我是c的初学者,所以我有一个问题就是让用户输入姓氏,逗号&然后名字。但是它将传递给函数调用

int get_name(FILE * fp)

在我的主要功能中。如果我必须使用参数参数,我有一个问题。

示例,main(int argc,char * argv []))或只是main(void))

从我到目前为止搜索的内容来看, FILE * fp 无法让用户从stdin进入它只用来打开文件(?)但是我需要让用户来从键盘输入并传递给函数。我写了一些代码。但它们似乎不起作用,但我打算在这里放下一个我确信我最需要改变的一个。

#define LINESIZE1024

int main(void){
    FILE *fp;
    char line[LINESIZE];
    char first;
    char last;
    char comma;
    while(1){
            if(!fgets(line,LINESIZE,stdin)){
                clearerr(stdin);
                break;
            }
            if(fp = (sscanf(line,"%s %s %s",&last,&comma,&first)==3))
                get_name(fp);
                if(get_last_first(fp)== -1)
                    break;
            printf("Please enter first name a comma and then last name");

        }

但我得到一个错误,说我不能使用从指针传递给整数。还有很多,但我不小心关闭了我的concolse和我试图修复时出现的所有错误都消失了。所以请给我一些想法。

seconde代码怎么样

while(1){
            if(!fgets(line,LINESIZE,fp)){
                clearerr(stdin);
                break;
            }
            if(sscanf(line,"%s %s %s",last,comma,first)==3)
                get_last_first(fp);

    return 0;
    }

它也给了我错误。 fp,last,first,逗号在此函数中使用未初始化

好的,所以我想我现在已经解决了以前的问题。但是,如果正确给出名称,则不会返回名称。这是我修复的主要代码。

int main(void){
    FILE *fp = stdin;
    char line[LINESIZE];
    char first[16];
    char last[16];

    while(1){
            if(!fgets(line,LINESIZE,stdin)){
                clearerr(stdin);
                break;
            }
            if(sscanf(line,"%s ,%s",last,first)==2)
                if(get_name(fp)==2)
                    printf("Your name is: %s %s\n", first, last);
    }

    return 0;
}

这是我的功能。

int get_name(FILE *fp){

    char line[LINESIZE];
    char last[16], first[16];
    int  n;

/* returns -1 if the input is not in the correct format
            or the name is not valid */
        if(fgets(line, LINESIZE, fp) == NULL) {
            return -1;
        }
        /* returns 0 on EOF */
        if((n = sscanf(line, " %[a-zA-Z-] , %[a-zA-Z-]", last, first)) == EOF) {
            return 0;
        }
        /* prints the name if it's valid */
        if((n = sscanf(line, " %[a-zA-Z-] , %[a-zA-Z-]", last, first)) == 2) {
            return 2;
        }
    return 1;
}

我非常感谢你们花时间阅读和帮助我。请不要吝啬:)

2 个答案:

答案 0 :(得分:0)

似乎你使它变得比需要的更复杂。请勿在{{1​​}}中致电fgetsscanf。只在函数main中执行此操作。

可能是这样的:

get_name

如果您以后决定要从文件中读取,则可以重用函数#include <stdio.h> #include <stdlib.h> #include <string.h> #define LINESIZE 1024 int get_name(FILE *fp) { char line[LINESIZE]; char* t; if(!fgets(line, LINESIZE,fp)) { printf("Error reading input\n"); return 0; } t = strstr(line, ","); if (t) { *t = '\0'; ++t; printf("First: %s - Last: %s\n", line, t); return 2; } printf("Illegal input\n"); return 0; } int main(int argc, char **argv) { get_name(stdin); return 0; } 而无需更改它。您只需要更改get_name即可。像:

main

答案 1 :(得分:-1)

如果您想通过键盘阅读,请先阅读stdin或使用内部从scanf读取的stdin。如果您想要从文件中读取,请使用FILE *fp,但不要忘记打开该文件并检查它是否成功(您将找到很多教程)。

此外,在读取字符串时,您需要一个字符数组,而不是一个字符。进一步注意,scanf已经可以处理类似&#34;的所有内容,而不是&#39;&#39;那么一个&#39;,&#39;然后一个字符串。请注意,格式"[^,]"表示&#34;除了&#39;以外的任何字符:&#39;:

所以你可以按如下方式修改代码:

#define LINESIZE 1024
int main(void){
    char line[LINESIZE];
    char first[LINESIZE];
    char last[LINESIZE];
    while(fgets(line,LINESIZE,stdin)) {
        if(sscanf(line,"%[^,],%s",last,first)==2) {
            printf("Read in %s ... %s\n",last,first);
        }
        else {
            printf("Please enter first name a comma and then last name");
        }
    }
    return 0;
}

如果你的教授对于&#34;使用文件*&#34;是挑剔的,你可以写:

FILE *fp = stdin;
...
while(fgets(line,LINESIZE,fp)) {
   ...