所以我试图创建一个使用write()系统调用的函数(printf和其他选项不可用)将字符串输出到控制台。但是,我遇到了障碍。
这是我的功能:
static void doPrint (const char *s)
{
write (STDOUT_FILENO, s, sizeof(s));
}
被称为:
doPrint(“Hello World!\ n”);
但是,它只打印出来:
Hello Wo
我做错了什么?
注意:限制访问stdlib和stdio
由于
答案 0 :(得分:4)
在此上下文中sizeof
不能执行您想要的操作 - 它会产生指针的大小,而不是字符串的大小。请改用strlen
。
但限制访问stdlib
您可以使用while
和计数器自行推广。未测试的:
size_t my_strlen(const char *s)
{
size_t len = 0;
while (*s++)
len++;
return len;
}
或稍高效的版本:
size_t my_strlen(const char* s)
{
const char *end = s;
while (*end++) {};
return end-s-1;
}
上述方法有效,因为指针前进到字符串中的最后一个位置,然后大小是最后一个指针位置和第一个指针位置之间的差值,当然减去1来处理空终止字符。
答案 1 :(得分:0)
问题在于你sizeof
。您需要明确传递大小或使用strlen
。它占用了指针的大小。 strlen
仅适用于以null结尾的字符串。
答案 2 :(得分:0)
问题是sizeof
指针变量是指针变量的长度。您希望strlen(s)
发现指针上有多少个字符。
答案 3 :(得分:0)
您不希望sizeof(s)
。要打印的字符数是字符串的长度,而不是指向字符串中第一个字符的指针的大小。
答案 4 :(得分:0)
s
是一个指针,而不是一个数组,所以你只打印第一个sizeof(char *)
个字节(在这种情况下它恰好是8个 - 你可能正在使用64位系统)。
您必须使用strlen()
找到字符串的长度:
write (STDOUT_FILENO, s, strlen(s));
您还应该阅读this document。
答案 5 :(得分:0)
write (STDOUT_FILENO, s, strlen(s));
假设您的字符串以空值终止。