格式"%s"期待和char *等类型的文章,我只想打印字母表

时间:2015-08-15 06:40:54

标签: c

为什么我不能使用此代码打印字母表?

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;

如何使用字符串打印字母,并编写函数?

3 个答案:

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