我在foo-结束时寻找一个6位数的随机数,我现在已经尝试了几个小时而没有成功。只有错误信息
note: expected 'char *' but argument is of type 'int'
我曾尝试将int转换为char,但它只是不喜欢它,我的代码在下面,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
char* concat(char *s1, char *s2)
{
char *result = malloc(strlen(s1)+strlen(s2)+1);//+1 for the zero-terminator
//in real code you would check for errors in malloc here
strcpy(result, s1);
strcat(result, s2);
return result;
}
int main ()
{
srand(time(NULL));
int r = rand();
printf(concat("foo-", r));
return 0;
}
答案 0 :(得分:2)
你可以这样做
printf("foo-%d", r);
或
char buffer[10];
sprintf(buffer, "%d", r);
char *c = concat("foo-", r);
printf("%s", c);
free(c);
这将使用您的功能。请阅读sprintf
和printf
答案 1 :(得分:1)
例如:
srand(time(NULL));
int r = rand();
char* str = (char*)malloc(sizeof(char)*20);
snprintf(str, 7, "%d", r);
if (strlen(str) < 6) { /* if r had less than 6 digits */
sprintf(str, "%06d", r);
}
char* s = concat("foo-", str);
printf("%s",s);
free(str);
free(s);
return 0;
来自http://joequery.me/code/snprintf-c/:
int snprintf(char *str, size_t size, const char *format, ...);
str
是printf输出重定向到的缓冲区。size
是将写入的最大字节数(字符数) 缓冲区,包括snprintf的终止空字符 自动为您安排。format
和可选...
snprintf()
参数只是字符串格式,如“%d”,myint如图所示 printf的。
因此,为了获得转换后的6位数字,您可以在size
中指定7
sprintf()
参数(包括空字符)。
str
函数将格式化的输出发送到第一个参数指向的字符串(在我们的例子中,这是%06d
)。 str
格式规定,snprintf()
至少会发送6位数字
您想将6位数字转换为字符数组。如果数字至少为6位数,sprintf()
,您将获得转换数字的前6位数字。如果它少于6位,r = 101;
将在开头添加零,直到有6位数。因此,如果000101
结果为concat
。
请注意您使用printf(concat("foo-",r));
功能:
printf()
编译器警告(在我的情况下为gcc):
警告:格式不是字符串文字,也不是格式参数 [-Wformat安全]
{{1}}函数需要知道传递的字符串参数的格式。这里有一个很好的答案:warning: format not a string literal and no format arguments
答案 2 :(得分:1)
在示例中,我使用sprintf
将int
转换为char[]
。此外,我正在使用模运算来确保结果不超过6位数。 %06d
的{{1}}参数将确保结果不少于6位。
sprintf
答案 3 :(得分:0)
当您尝试使用concat
值int
作为第二个参数调用r
时,会出现问题。注意你对concat的定义:
char* concat(char *s1, char *s2);
第二个参数是char *s2
。在您的程序中,您尝试使用以下命令调用它:
int r = rand();
printf(concat("foo-", r));
r
是一个整数。试试这个来解决问题:
int main ()
{
srand(time(NULL));
int r = rand();
char str[] = "bar";
printf(concat("foo-", str));
return 0;
}