gpt4 book ai didi

c - C语言中带\0的字符串长度

转载 作者:太空宇宙 更新时间:2023-11-04 04:12:59 24 4
gpt4 key购买 nike

好吧,我读取用户的输入是:

scanf("%[^\n]", message); 

我现在初始化 char message [100] ="";,在另一个函数中我需要找出消息中输入的长度,我用 strlen(),不幸的是当我稍后在终端中时它不能正常工作

echo -e "he\0llo" | .asciiart 50 

它将读取整个输入,但 strlen 将只返回长度 2。

有没有其他方法可以找出输入的长度?

最佳答案

根据定义 strlen 在空字符处停止

你必须数/读到 EOF 和/或换行符,而不是在你读完字符串后数到空字符

如备注中所述,%n 允许获取读取字符数,示例:

#include <stdio.h>

int main()
{
char message[100] = { 0 };
int n;

if (scanf("%99[^\n]%n", message, &n) == 1)
printf("%d\n", n);
else
puts("empty line or EOF");
}

编译和执行:

pi@raspberrypi:/tmp $ gcc -g c.c
pi@raspberrypi:/tmp $ echo "" | ./a.out
empty line or EOF
pi@raspberrypi:/tmp $ echo -n "" | ./a.out
empty line or EOF
pi@raspberrypi:/tmp $ echo -e "he\0llo" | ./a.out
6
pi@raspberrypi:/tmp $

如您所见,无法区分空行和 EOF(即使查看 errno)

你也可以使用 ssize_t getline(char **lineptr, size_t *n, FILE *stream); :

#include <stdio.h>
#include <stdlib.h>

int main()
{
char *lineptr = NULL;
size_t n = 0;
ssize_t sz = getline(&lineptr, &n, stdin);

printf("%zd\n", sz);

free(lineptr);
}

但在这种情况下可能的换行符被获取并计算在内:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -g c.c
pi@raspberrypi:/tmp $ echo -e "he\0llo" | ./a.out
7
pi@raspberrypi:/tmp $ echo -e -n "he\0llo" | ./a.out
6
pi@raspberrypi:/tmp $ echo "" | ./a.out
1
pi@raspberrypi:/tmp $ echo -n "" | ./a.out
-1

关于c - C语言中带\0的字符串长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55207042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com