c - 为什么直接给出字符串和读取字符串时strlen返回不同的值?
问题描述
当我直接键入字符串时,例如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char phrase[100] = "lonesomestreet";
char phrase2[100] = "lonesomestreet";
printf("String 1 has %d characters, and string 2 has %d characters.\n", strlen(phrase), strlen(phrase2));
system("pause");
return 0;
}
它为两者返回 14 个字符。但是,如果我阅读它们:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char phrase[100];
char phrase2[100];
printf("Type a phrase:\n");
fgets(phrase,100,stdin);
printf("Type a phrase:\n");
fgets(phrase2,100,stdin);
printf("String 1 has %d characters, and string 2 has %d characters.\n", strlen(phrase), strlen(phrase2));
system("pause");
return 0;
}
它为两者返回 15 个字符。谁能解释一下为什么会这样?
增加项。如果我计算字符,它也会给出 15:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char phrase[100];
char phrase2[100];
printf("Type a phrase:\n");
fgets(phrase,100,stdin);
printf("Type a phrase:\n");
fgets(phrase2,100,stdin);
int k=0;
for (int i=0; phrase[i]!='\0'; i++) {
k++;
}
printf("The phrase has %d characters.\n", k);
system("pause");
return 0;
解决方案
如果目标字符数组中有足够的空间,标准函数 fgets 可以附加换行符。你应该删除它。例如
#include <string.h>
#include <stdio.h>
//...
fgets(phrase,100,stdin);
phrase[ strcspn( phrase, "\n" ) ] = '\0';
或者您可以通过以下方式重写您的 for 循环
size_t i = 0;
while ( phrase[i] !='\0' && phrase[i] != '\n' ) ++i;
printf("The phrase has %zu characters.\n", i);
请注意,在尝试输出标准 C 函数返回的值时,应使用转换说明符%zu
,而不是因为返回的值具有类型%d
strlen
size_t
printf("String 1 has %zu characters, and string 2 has %zu characters.\n", strlen(phrase), strlen(phrase2));
推荐阅读
- bash - 来自 bash 和来自 sh 的调用行在行为上有所不同
- xamarin.mac - 从 PKG 文件安装应用程序在应用程序中不可见
- python - 将 ms 转换为 datetime 时应用时区
- java - Swagger API 标签描述未发布
- c# - 如何使可扩展的表格视图用作子菜单?
- sql - Postgres - 在表中的列中搜索特定值
- ios - 使用简单的 init 在测试中创建 CoreData 对象
- java - 如何在 Angular 前端从 REST-Backend 接收一个字符串
- sparql - 检索地球上前十个最高点的列表
- angular - 组件内的模板引用变量