2017-06-12 25 views
-4

我是一个初学者在C,所以我有一个问题,让用户输入姓氏,逗号&然后名。但是它会传递给函数调用获取用户输入名称,但使用文件流* fp

INT GET_NAME(FILE * FP)

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

例,主(INT ARGC,CHAR *的argv []))或只是主(无效))

,从我到目前为止已经搜索,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,最后,首先,在这个函数中使用未初始化的逗号

好吧,我想我已经解决了以前的问题。但是,如果名称正确给定,它不会打印回名称。这是我的固定主代码。

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; 
} 

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

+3

表达式'(sscanf(line,“%s%s%s”,&last,&comma,&first)== 3)'不会返回一个'FILE *'。你应该启用警告。 – Medinoc

+0

是否要将输入的名称存储在文本文件中? – Gaurav

+0

@GauravPathak no。我不想。我的老师说:“测试时使用stdin作为FILE * - 你不需要打开任何文件。”所以我很困惑如何获得用户输入并将其作为* fp传递。 – dyingStudent

回答

-1

如果您想从键盘读取数据,请从stdin读取数据或使用scanf,它们在内部从stdin中读取数据。如果您想要从文件中读取,请使用FILE *fp,但不要忘记打开文件并检查文件是否成功(您会发现很多教程)。

此外,在字符串中读取时,您需要一组字符,而不是一个字符。进一步注意,scanf已经可以处理的格式一样,除了一个“”任何字符“的一切,是不是‘’那么‘’然后一个字符串注意格式"[^,]"手段。”:

,所以你可以适应代码如下:

#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; 
} 

如果你的教授是挑剔的关于“使用FILE *”,你可以写:

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

你好,但我给了函数原型int get_name(FILE * fp)我没有要求打开文件或任何东西。 – dyingStudent

+0

看到编辑答案 –

+0

是的!我现在也使用它!我认为它是有效的。它怎么都不打印回来。我会发布我的代码的功能。请看一下。 – dyingStudent

0

看来你是使它比需要更多的复杂。请勿拨打和scanf拨打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即可。 like:

int main(int argc, char **argv) 
{ 
    FILE* f = fopen("test.txt", "r"); 
    if (f) 
    { 
     get_name(f); 
     fclose(f); 
    } 
    else 
    { 
     printf("Open file failed\n"); 
    } 
    return 0; 
} 
+0

哦,对不起!那里有一个评论,我很困惑那个人和你在一起。再次感谢你!!!!你帮了很多忙。 – dyingStudent

+0

@dyingStudent - 好 - 我明白了。让我们删除评论。 – 4386427