转换字符和fgets()函数未按预期工作

时间:2015-10-31 01:39:55

标签: c

我正在尝试编写代码来查找数据类型的大小,这是我的代码:

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

我的问题是:

  1. 为什么Xcode不接受除%lu之外的任何转换字符,例如我用“int”语句尝试了'%d',但我收到警告说该参数的类型为'unsigned long'?

  2. scanf()函数对我有用,但不适用于fgets()函数。

  3. 据我所知,fgets()函数中的size参数是它可以容纳的最大大小而不是必须满足(所以如果较小的大小那么好),那么为什么我无法使用fgets()而不是scanf()。

    感谢。

1 个答案:

答案 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
}