我正在尝试编写代码来查找数据类型的大小,这是我的代码:
#include <stdio.h>
#include <limits.h>
#include <string.h>
int main(int argc, const char * argv[]) {
// insert code here...
printf("Choose one of the following types to get the relevant storage size\n(int, float, double, short, long, char: ");
char mytype1[7] = "";
char mytype2[4] = "int";
char mytype3[7] = "double";
char mytype4[6] = "short";
char mytype5[5] = "long";
char mytype6[5] = "char";
char mytype7[6] = "float";
scanf("%s", mytype1);
// fgets(mytype1, 7, stdin);
if (strcmp(mytype1, mytype2) ==0){
printf("The 'int' variable size is %lu\n", sizeof(int));
} else if (strcmp(mytype1, mytype3) ==0){
printf("The 'double' variable size is %lu\n", sizeof(double));
} else if (strcmp(mytype1, mytype4) ==0){
printf("The 'short' variable size is %lu\n", sizeof(short));
} else if (strcmp(mytype1, mytype5) ==0){
printf("The 'long' variable size is %lu\n", sizeof(long));
} else if (strcmp(mytype1, mytype6) ==0){
printf("The 'char' variable size is %lu\n", sizeof(char));
} else if (strcmp(mytype1, mytype7) ==0){
printf("the 'float' variable size is %lu\n", sizeof(float));
} else {
printf("incorrect choice\n");
}
return 0;
}
我的问题是:
为什么Xcode不接受除%lu之外的任何转换字符,例如我用“int”语句尝试了'%d',但我收到警告说该参数的类型为'unsigned long'?
scanf()函数对我有用,但不适用于fgets()函数。
据我所知,fgets()函数中的size参数是它可以容纳的最大大小而不是必须满足(所以如果较小的大小那么好),那么为什么我无法使用fgets()而不是scanf()。
感谢。
答案 0 :(得分:1)
对于您的第一个问题,sizeof
会返回size_t
类型的值,该值通常是unsigned long
的别名,因此"%lu"
格式有效。但是,您应该不使用该格式,而应使用"%zu"
指定具有size_t
参数(see e.g. this printf
(and family) reference)。
至于你的第二个问题,你必须记住fgets
可以包含新行(如果它适合)在字符串中。您必须明确检查并删除它:
if (fgets(mytype1, sizeof(mytype1), stdin) != NULL)
{
if (mytype1[strlen(mytype1) - 1] == '\n') // Is the last character a newline?
mytype1[strlen(mytype1) - 1] = '\0'; // Yes, change it to the string terminator
}