首页 > 解决方案 > 为什么直接给出字符串和读取字符串时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;

标签: cnewlinefgetsstrlen

解决方案


如果目标字符数组中有足够的空间,标准函数 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,而不是因为返回的值具有类型%dstrlensize_t

printf("String 1 has %zu characters, and string 2 has %zu characters.\n", strlen(phrase), strlen(phrase2));

推荐阅读