为什么strlen()不代表我的字符串的实际长度?

时间:2018-11-29 22:45:40

标签: c

基本上,我有一个由多个单词组成的字符串,例如:"Hello world test"
如果我尝试使用这样的结构进行打印

printf("%s", string);

或类似的

for (int i = 0; i < strlen(string); ++i) {
    printf("%c", string[i];
}

我总是将其作为输出:Hello world,并且得到的结果是11而不是16。

如果我尝试使用以前对字符串中的单个字符进行计数的int计数器打印出相同的字符串,则

for (int i = 0; i < counter; ++i) {
    printf("%c", string[i];
}

我实际上得到了正确的输出Hello world test,这导致我们相信在字符串中已正确分配了元素,但是由于某些原因,%s和strlen忽略了最后一个空格之后的元素。

为什么会这样?到底是怎么回事?我该如何解决?

编辑:

实际要求的代码:

#include <stdio.h>
#include <string.h>
typedef int BOOL;
#define TRUE 1
#define FALSE 0


int main() {
    char sentence[64] = " ", reversal[64] = " ", reversal_copy[64] = " ";
    int index = 0, counter = 0;
    BOOL reset = TRUE, last_cycle = FALSE;

    printf("Enter a sentence: ");
    for (int i = 0; sentence[strlen(sentence) - 1] != '\n'; i++) {
        scanf("%c", &sentence[i]);
    }

    /* Copies the input in a string reversing it */
    for (int h = strlen(sentence) - 2, k = 0; h >= 0; h--, k++) {
        reversal[k] = sentence[h];
    }

    /* Detects the first character of a word and the last character of the same word before a space,
    switching the first char with the last, the second with the pre-last and so on*/
    for (int i = 0; i < strlen(reversal); i++) {
        if (reset == TRUE) {
            index = i;
            reset = FALSE;
        }
        if (i == strlen(reversal) - 1) {
            last_cycle = TRUE;
            counter++;
        }
        if (reversal[i] != ' ') {
            counter++;
            if (last_cycle == TRUE) {
                goto reversing;
            }
        }
        else {
        reversing:
            for (int h = index, z = counter; h < counter; h++, z--) {
                reversal_copy[h] = reversal[z - 1];
                reversal_copy[z - 1] = reversal[h];
            }
            if (last_cycle == FALSE) {
                reversal_copy[i] = ' ';
            }
            reset = TRUE;
            counter++;
        }
    }
    printf("%lu ", strlen(reversal_copy));
    for (int i = 0; i < counter; i++) {
        printf("%c", reversal_copy[i]);
    }
    printf("%s\n\n", reversal_copy);

    return 0;
}

4 个答案:

答案 0 :(得分:4)

如果<script id="sap-ui-bootstrap" src="https://openui5.hana.ondemand.com/resources/sap-ui-core.js" data-sap-ui-libs="sap.ui.core, sap.m" data-sap-ui-async="true" data-sap-ui-theme="sap_belize" data-sap-ui-compatversion="edge" data-sap-ui-xx-waitfortheme="true" data-sap-ui-xx-xml-processing="sequential" ></script> <body id="content" class="sapUiBody sapUiSizeCompact" style="height: 100%;"></body>返回11,则在世界“世界”之后您有一个strlen()字符。

\0strlen都使用0终止符来确定“字符串是什么”,因此它们的行为相同也就不足为奇了。

答案 1 :(得分:1)

尽管没有Minimal, Complete, and Verifiable example很难回答,但我将解释您所观察到的行为的最可能原因。

带有printf格式说明符的%sstrlen都给出了相关参数所指向的空终止字符串的长度。如果他们打印/报告的长度为11,但是遍历整个char数组且硬编码值为16,则输出为“ hello world test”,则world之后的字符显然是空字符'\ 0 '。

答案 2 :(得分:0)

尝试以输入“ A”为例运行您的程序-请注意,即使是一个单词也会出现问题。

当您倒换最后一个单词时,出现了问题。您正在将结尾'\0'放在其前面。它可能与特殊的大小写以及goto逻辑周围的last_cycle有关,这很难遵循。

我认为这可能与您在该代码路径中有两个counter++的事实有关。

考虑使用一些功能来使代码更简洁:

len = strlen(reversal);
for (start=0; start<len; start++) {
   end = find_space_or_null(reversal, start);
   if (end > start) {
    reverse_chars(reversal, start, end-1);
    start = end;
   }
}

答案 3 :(得分:0)

  

该程序接受用户输入的字符串,例如“天是蓝色”,并打印出“天是蓝色”

这对strtok()来说是完美的工作:

#include <stddef.h>
#include <stdio.h>
#include <string.h>

enum { MAX_LINE = 120 };

int main()
{
    char buffer[MAX_LINE];
    fgets(buffer, MAX_LINE, stdin);

    size_t length = strlen(buffer);
    if (length && buffer[length - 1] == '\n')  // get rid of the newline
        buffer[--length] = '\0';

    char *tokens[MAX_LINE] = { 0 };  // there can't be more than 60 tokens, but hey
    if ((tokens[0] = strtok(buffer, " ")) == NULL)  // no tokens? nothing to do.
        return 0;

    size_t i = 1;
    for (; tokens[i - 1] && i < sizeof(tokens); ++i)
        tokens[i] = strtok(NULL, " ");  // tokenize the buffer

    --i;  // the very last was NULL anyway.
    while (--i)  // print it reverse
        printf("%s ", tokens[i]);
    puts(buffer);
}

样本输出:

The quick brown fox jumps over the lazy dog
dog lazy the over jumps fox brown quick The