如何删除输出中多余的换行符?

How to remove the extra newline in the output?

提问人:Krinesh Vasava 提问时间:11/16/2023 最后编辑:Fe2O3Krinesh Vasava 更新时间:11/16/2023 访问量:66

问:

反向字符串程序:

/**
 * C program to reverse order of words in a string
 */
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100 // Maximum string size

int main()
{
    char str[100], reverse[100];
    int len, i, index, wordStart, wordEnd;

    printf("Enter any string: ");
    fgets(str,sizeof(str),stdin);

    len   = strlen(str);
    index = 0;

    // Start checking of words from the end of string
    wordStart = len - 1;
    wordEnd   = len - 1;

    while(wordStart > 0)
    {
        // If a word is found
        if(str[wordStart] == ' ')//means blank space
        {
            // Add the word to the reverse string
            i = wordStart + 1;
            while(i <= wordEnd)
            {
                reverse[index] = str[i];

                i++;
                index++;
            }
            reverse[index++] = ' ';

            wordEnd = wordStart - 1;
        }

        wordStart--;
    }

    // Finally add the last word
    for(i=0; i<=wordEnd; i++)
    {
        reverse[index] = str[i];
        index++;
    }

    // Add NULL character at the end of reverse string
    reverse[index] = '\0'; 

    printf("Original string:%s\n\n", str);
    printf("Reverse  string:%s", reverse);

    return 0;
}

并输出:

Enter any string: stack overflow
Original string: stack overflow
Reverse  string: overflow
stack

我的预期输出:

Enter any string: stack overflow
Original string: stack overflow
Reverse  string: overflow stack

我正在尝试逐字反转字符串,但反转字符串不在同一行中打印。

数组 C 字符串

评论

0赞 Some programmer dude 11/16/2023
请从选择一种语言开始。C 和 C++ 是两种截然不同的语言,它们的自然解决方案会非常不同。
0赞 Some programmer dude 11/16/2023
为了解决当前代码遇到的任何问题,这似乎是学习如何调试程序的好时机。例如,使用调试器逐行执行它,同时监视变量及其值。
0赞 juliushuck 11/16/2023
@Someprogrammerdude我认为当你看到它时,很难发现这个错误,因为它是一个看不见的字符。但我同意,当您输出字符代码或在线分析它们时,这可以很容易地进行调试。
0赞 Some programmer dude 11/16/2023
另请注意,您的代码根本不处理尾随空格,而不仅仅是换行符。

答:

2赞 juliushuck 11/16/2023 #1

fgets获取读取输入行,包括按 Enter 键导致的换行符。因此,如果输入 ,str 的实际内容将变为 。stack overflowstack overflow\n

if (len > 0 && str[len - 1] == '\n') {
    str[len - 1] = '\0';
    len--;
}

评论

0赞 greg spears 11/16/2023
是的,这明白了。我希望每个人都会注意到 OP 要求解决输出中的换行符问题——而不是如何反转字符串。标题有点误导。
1赞 juliushuck 11/16/2023
没错,应更改问题标题或删除问题。
0赞 greg spears 11/16/2023
我提交了标题更改编辑。它位于审批队列中。
1赞 Harith 11/16/2023 #2

或者,您可以使用:

str[strcspn(str, "\n")] = '\0';

从字符串中删除换行符。

0赞 Fe2O3 11/16/2023 #3

完成工作的另一个(简单)替代方案:

(void)strtok( str, "\n" ); // trim LF from end of string

用来证明你知道你在做什么......(void)

(PS:在从琴弦末端修剪 LF 之后不要打电话......strlen()