我知道这对大多数人来说可能会非常简单,但我是新手,所以请不要介意我。我正在尝试通过在c程序的printf / scanf行中使用其名称将变量值赋值给另一个。这是代码:
int day, month, counter;
int sunday = 0;
int monday = 1;
int tuesday = 2;
int wednesday = 3;
int thursday = 4;
int friday = 5;
int saturday = 6;
printf("Enter how many days in the month:\n");
scanf("%i", &month);
printf("Enter what day the month starts on:\n");
scanf("%i", &day);
这只是其中的一部分,但我正在尝试做的是,当用户在第二个printf / scanf行中输入实际的日期名称时,它将调用int的值并将其分配给日期值。问题是它不起作用,我不知道为什么。
答案 0 :(得分:2)
您无法在C中执行此操作(在scanf
运行时从键盘输入变量名称),这不是脚本语言。基本上,所有变量的名称在编译步骤中都会丢失(它们仍然可以保存为调试信息,由调试器使用,例如gdb,但程序通常不会在运行时使用它。)
您应该通过char*
通过char []
输入字符串(类型为scanf
或%s
的字符数组),然后手动解析,例如
char string[50];
scanf("%s", string);
if( strcmp(string, "monday") == 0 )
day = 1;
else if ( strcmp(string, "tuesday") == 0 )
day = 2;
等等。
答案 1 :(得分:2)
对于初学者来说,就像那样。
int day, month, counter;
char *dofw[] = { "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", NULL};
char day_string[20];
printf("Enter how many days in the month:\n");
scanf("%d", &month);
printf("Enter what day the month starts on:\n");
scanf("%20s", day_string);
int i;
day = -1;
for(i=0; dofw[i]; i++) {
if(strcmp(day_string, dofw[i]) == 0) {
day = i;
break;
}
}
if(day == -1)
printf("User Y U not give good day\n");
答案 2 :(得分:1)
您需要编写一个函数或一组函数,使用它来呈现程序的单个接口,它将扫描程序已读取的字符串(非整数),并将其转换为适当的值。您可能应该使代码不区分大小写,并且能够接受有效(唯一)缩写(如Sa,Su,M,Tu,W,Th,F)等。您可能会也可能不会接受星期几数字作为名称的替代品。如果您不得不担心国际化或I18N(S,D,L,J,Ma,Me,V for Samedi,Dimanche,Lundi,Mardi,Mercredi,Jeudi,Vendredi in French等),这会增加这些功能的复杂性(但不是使用它们的代码的复杂性。)
C没有提供直接的方法。最接近的方法是POSIX strptime()
,我认为它没有完整处理它。
答案 3 :(得分:0)
%d
类型scanf()
时使用int
。
答案 4 :(得分:0)
如果你做一个接受有符号整数(scanf
)的%i
,你不能指望整数。如果用户输入一个字符串(比如星期日,所以你希望那天收到'0'值),你必须以不同的方式进行。
也许您可以要求用户在输入数据之前插入格式(printf("Enter the format of day ('n' for name, 'd' for number:\n"
);然后,根据用户的选择,你可以做一个不同的扫描f:如果我选择'n',那么你可以过去找到相应的数值。
如果我建议您改进代码,则必须声明不同的日期或使用数组或结构或枚举。