使用char和strcmp比较c中的两个数字

时间:2017-01-28 03:58:34

标签: c

我正在尝试使用strcmp比较两组数据。第一组数据是var1,来自fgets(var1, 100, stdin)。第二组数据由rand随机生成。当我编译它时,我得到两个相同的错误。他们都来自char f

  

警告:赋值使用整数而不使用强制转换printf(f);

     

警告:赋值使用整数而不使用强制转换if (strcmp(var1,f)==0)

我已经在char中声明了随机生成的数字char f = rand() % 38;,为什么它不起作用?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>  
#include <string.h>

int main()
{
    char var1[100];
    int result; 

    fgets(var1, 100, stdin);          
    srand(time(NULL));

    char myArray[38] = { 1,5,3,4};
    char f = rand() % 38;

    printf(var1);         
    printf(f);        

    if (strcmp(var1,f)==0) {
        result = 1;
        printf("It work\n");
    }
    else {
        printf("It didn't work!\n");
        result = 0;
    }

    return 0;
}

已编辑的代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>  
#include <string.h>

int main()
{
    char var1[100];
    int result; 

    scanf("%s",var1);          
    srand(time(NULL));

    char myArray[7] = { 0,28,9,26,30,11,7 };
   int randomindex= 1 + (rand() % 100);
 char f = myArray[randomindex];
   char str_f[2] = { f, '\0' };
        printf("var1: %s\n",var1);
   printf("%s",str_f);

   printf("\n");
    if (strcmp(var1,str_f)==0) {
        result = 1;
        printf("It work\n");
    }
    else {
        printf("It didn't work!\n");
        result = 0;
    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

如上所述,在 C Langage 中,库中的函数具有严格的格式,并且在编译时或运行时使用的格式不会出现警告或错误。

功能1 - printf()是将C字符串写入标准输出stdout(在<stdio.h>中声明)的常用函数。

  

请参阅C library function - printf()

int printf(const char *format, ...)

在提供的源代码中,printf()函数已用于以下情况:

  1. printf("It work\n");写一个符合第一个参数的const char *预期格式的固定字符串==&gt; 确定
  2. printf(var1);写入输入的字符串var1(声明为char var1[100];)的内容,该内容不完全符合第一个参数的const char *,但会在编译期间进行转换时间。用于编写var1字符串的建议格式可以是printf("%s",var1);(或更详细printf("var1: %s",var1);),其中第一个参数"%s"将指定以下参数var1将是一个字符串。
  3. printf(f);写入随机值(声明为char f;)的内容,该内容不符合第一个参数的const char *且根本不编译。写f字符的最小预期格式为printf("%c",f);(或更详细printf("f=%c",f);),其中第一个参数"%c"将指定以下参数f将是一个角色。
  4. 功能2 - strcmp()是一个比较两个C字符串参数的函数(在<string.h>中声明。

      

    请参阅C library function - strcmp()

    int strcmp(const char *str1, const char *str2)
    

    在提供的源代码中,strcmp()函数未按指定使用。该函数需要两个输入参数:

    1. strcmp(var1,...)==0的第一个参数是var1(声明为char var1[100];),它不完全符合const char *,但会在编译期间进行投射。
    2. strcmp(...,f)==0的第二个参数是f(声明为char f;),它不符合const char *且根本不编译。
    3.   

      要将字符fvar1进行比较,必须进行   将其转换为字符串(在C中,字符串是以char结尾的数组   一个角色)。

      解决方案1 ​​ - 如何将字符char f;转换为字符串。

      C字符串是一个字符数组:char str_f[]= { '<char>', ... , '<NUL>' };。这意味着将字符char f;转换为字符串需要最少2个字符的数组。

      char f = rand() % 38;
      // use a 2 characters string
      char str_f[2] = { f, '\0' };
      // Could be also initialised as str_f[0] = f; str_f[1] = '\0'; 
      
      // compare the strings using `str_f`
      if (strcmp(var1,str_f)==0) {
      

      警告1 - 请注意随机值范围。

        

      打印字符时,应该用ASCII填充C字符串   不同的字符用于结束字符串。

      在提供的源代码中,fchar f = rand() % 38;的赋值将生成0到37之间的值,其中包括字符和前31个不可打印的字符(ctrl-characters)。只显示大于31的字符。

        

      将更容易生成:char f = ' ' + (rand() % 38);   其中' '是第一个可打印的ASCII字符= 32