c - 格式 "%s"需要 char* 等类型的参数,我只想打印字母表

标签 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);
}

我收到此警告

format ' %s ' expects type 'char*' but argument 2 has type 'int'

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

最佳答案

您的整个 print_alf 函数看起来很可疑。

  • 您返回的 str 类型为 char *。因此print_alf的返回类型应该是char *而不是int
  • 您的 while (str[i]) 循环根本没有任何意义,因为您将未初始化的内存传递给它。因此,您的代码很可能会损坏内存,因为 while 循环将继续运行,直到在内存中找到 '\0' ,而在传递的内存边界内不需要出现这种情况(a)。
  • 您没有在字符串末尾添加零终止字符 ('\0')。这将导致 printf("%s", print_alf(a)); 打印从 a 地址开始的尽可能多的字符,直到 '\0' 在内存中找到。

以下是如何解决所有这些问题的建议:

char *print_alf(char *str, size_t len)
{
    char letter;

    if ((str) && (len >= 27))   // is str a valid pointer and length is big enough?
    {
        for (letter = 'A'; letter <= 'Z'; letter++)   // iterate all characters of the alphabet
        {
            *str = letter;
            str++;
        }

        *str = '\0';   // add zero termination!!!
    }
    else
    {
        str = NULL;   // indicate an error!
    }

    return (str);
}

int main()
{
    char a[26 + 1];   // ensure '\0' fits into buffer!
    printf("%s", print_alf(a, sizeof(a)));
    return (0);
}

关于c - 格式 "%s"需要 char* 等类型的参数,我只想打印字母表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32022274/

相关文章:

c - 段错误核心转储 gcc 代码块

c++ - C99 stdint.h 头文件和 MS Visual Studio

c - 当我的编译器以 C 为目标时如何提供源代码级调试信息

c - 是否有任何具有通用数据结构的开源 C 库?

c++ - 优化:为什么 < 比 multiple 更昂贵!=

c - 使用 fgets 将 double 存储到结构中

c - 在 64 位中将地址空间大小保持为 4 GB

c - printf - C 中的实现

C printf整数类型U32

c - 用指针数组写入每个字