我是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;
}
我非常感谢你们花时间阅读和帮助我。请不要吝啬:)
答案 0 :(得分:0)
似乎你使它变得比需要的更复杂。请勿在{{1}}中致电fgets
和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
答案 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)) {
...