我正在尝试使用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;
}
答案 0 :(得分:1)
如上所述,在 C Langage 中,库中的函数具有严格的格式,并且在编译时或运行时使用的格式不会出现警告或错误。
功能1 - printf()
是将C字符串写入标准输出stdout
(在<stdio.h>
中声明)的常用函数。
int printf(const char *format, ...)
在提供的源代码中,printf()
函数已用于以下情况:
printf("It work\n");
写一个符合第一个参数的const char *
预期格式的固定字符串==&gt; 确定强>,printf(var1);
写入输入的字符串var1
(声明为char var1[100];
)的内容,该内容不完全符合第一个参数的const char *
,但会在编译期间进行转换时间。用于编写var1
字符串的建议格式可以是printf("%s",var1);
(或更详细printf("var1: %s",var1);
),其中第一个参数"%s"
将指定以下参数var1
将是一个字符串。printf(f);
写入随机值(声明为char f;
)的内容,该内容不符合第一个参数的const char *
且根本不编译。写f
字符的最小预期格式为printf("%c",f);
(或更详细printf("f=%c",f);
),其中第一个参数"%c"
将指定以下参数f
将是一个角色。 功能2 - strcmp()
是一个比较两个C字符串参数的函数(在<string.h>
中声明。
int strcmp(const char *str1, const char *str2)
在提供的源代码中,strcmp()
函数未按指定使用。该函数需要两个输入参数:
strcmp(var1,...)==0
的第一个参数是var1
(声明为char var1[100];
),它不完全符合const char *
,但会在编译期间进行投射。strcmp(...,f)==0
的第二个参数是f
(声明为char f;
),它不符合const char *
且根本不编译。要将字符
f
与var1
进行比较,必须进行 将其转换为字符串(在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字符串 不同的字符用于结束字符串。
在提供的源代码中,f
,char f = rand() % 38;
的赋值将生成0到37之间的值,其中包括字符和前31个不可打印的字符(ctrl-characters)。只显示大于31的字符。
将更容易生成:
char f = ' ' + (rand() % 38);
其中' '
是第一个可打印的ASCII字符= 32
。