为什么我不能使用此代码打印字母表?
void ft_putchar(char c)
{
write(1, &c, 1);
}
int print_alf(char *str)
{
int i;
i = 0;
while (str[i])
{
if (i >= 'A' && i <= 'Z')
ft_putchar(str[i]);
else
ft_putchar('\n');
i++;
}
return (str);
}
int main ()
{
char a[26];
printf("%s", print_alf(a));
return (0);
}
我收到此警告
格式&#39; %s&#39;期望类型&#39; char *&#39;但是参数2的类型为&#39; int&#39;
如何使用字符串打印字母,并编写函数?
答案 0 :(得分:3)
您的整个print_alf
函数看起来很可疑。
str
的{{1}}。因此,char *
的返回类型应为print_alf
而不是char *
。int
循环毫无意义,因为你正在将未初始化的内存传递给它。所以你的代码很可能会破坏内存,因为while循环将继续运行,直到在内存中找到while (str[i])
,而在传递的内存边界内不需要这样('\0'
)。a
)。这将导致'\0'
打印从printf("%s", print_alf(a));
地址开始的多个字符,直到在内存中找到a
。以下是如何解决所有问题的建议:
'\0'
答案 1 :(得分:1)
您的print_alf(char *str)
函数实际上返回一个导致错误的整数(定义为返回int)。当您将%s
指定为printf
时,它需要字符,而不是数字。
您可以通过将函数的返回类型更改为char来解决此问题,如果其他所有代码都适用于您的代码,那么您将会很高兴。
答案 2 :(得分:1)
请注意print_alf
是否应该返回一个字符串,然后使用printf
打印,或者print_alf
是否应该是执行打印的void函数,然后您应该调用它没有printf。目前,您的代码试图成为两者的混合。
最简单的方法是打印字母表:
void print_alf(void)
{
int c;
for (c = 'A'; c <= 'Z'; c++) putchar(c);
}
像这样调用此函数:
print_alf(); // print whole alphabet to terminal
更复杂的变体是用字母填充字符串然后打印该字符串。我认为这就是你想要实现的目标。在这种情况下,您必须将足够大的缓冲区传递给函数并返回它。请注意,如果要使用标准库(其中printf("%s", ...)
为一个)的字符串函数和功能,则必须对字符串进行空终止。
char *fill_alf(chat *str)
{
int i;
for (i = 0; i < 26; i++) str[] = 'A' + i;
str[26] = '\0';
return str;
}
可以返回传递给函数的缓冲区,但要注意返回本地字符缓冲区的情况,这会导致未定义的行为。
您可以按原样在原始代码中调用它,但请注意,您必须使缓冲区至少27个字符才能容纳26个字母和空终止符:
char a[27];
printf("%s\n", fill_alf(a));
或者,您可以分两步执行填充和打印:
char a[27];
fill_alf(a); // ignore return value, because it's 'a'
printf("%s\n", a); // print filled buffer
如果您只想打印字母表,print_alf
变体更简单直接。如果您想在字母表中进一步操作,例如进行随机播放,请考虑使用fill_alf
。