【问题标题】:Unexpected line break in printf in cc中的printf中出现意外的换行符
【发布时间】:2021-12-27 15:00:07
【问题描述】:

我正在学习 c 中的字符串,并且正在做作业,要求我编写一个程序来在某些情况下替换部分字符串。这是我的源代码(未完成):

#include <stdio.h>
#include <string.h>
int main()
{
    char str1[128], str2[128], str3[128];
    for (int i = 0; i < 128; i++) //initialize str
    {
        str1[i] = 0;
        str2[i] = 0;
        str3[i] = 0;
    }
    printf("Input the first string:"); //inputs
    fgets(str1, 128, stdin);
    printf("Input the second string:");
    fgets(str2, 128, stdin);
    printf("Input the third string:");
    fgets(str3, 128, stdin);
    if (strncmp(str1, str2, strlen(str2) - 1) == 0) //if the first n charters match (n=length of str2)
    {
        printf("%s", str3); //print str3
        int RemainingChar = 0;
        RemainingChar = strlen(str1) - strlen(str2);
        for (int i = 0; i < RemainingChar; i++)
        {
            printf("%c", str1[i + strlen(str2) - 1]); //print the remaining part
        }
    }
    return 0;
}

这是它的运行方式:

Input the first string:asdfghjkl
Input the second string:asd
Input the third string:qwe
qwe
fghjkl

出现意外的换行符。我应该怎么做才能使它像这样输出:qwefghjkl

【问题讨论】:

  • 欢迎来到 SO。这有点令人费解。您似乎知道 \n 存储在缓冲区中。否则这不会一起出现:strlen(str2)-1 和评论 (n=length of str2)。但是在打印的时候,你忘记了......
  • 您可以更轻松地初始化数组:char str1[128] = "";。这将用 0 个字节填充所有内容。
  • @Gerhardh 这个问题必须被问到为什么,人们会觉得有必要将字符串归零。 fgets() 零终止输入。
  • @Gerhardh 感谢您教我一种初始化字符串的新方法。 :) 其实我还没有学过buffer,我只是有一个大概的感觉。 :(
  • 其实和字符串没有直接关系。对于所有结构或数组,您可以提供比元素更少的初始值设定项。在这种情况下,所有剩余元素都将设置为 0。在我的示例中,"" 只是一个空字符串,即只有一个 0 字节,所有其他字节将自动设置为 0。

标签: c string printf


【解决方案1】:

函数fgets 还会将行尾的换行符'\n' 存储到字符串中。如果您不希望打印此换行符,则必须在打印字符串之前将其删除。

有关删除换行符的几种方法,请参阅以下问题:

Removing trailing newline character from fgets() input

【讨论】:

  • 谢谢你的回答:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
相关资源
最近更新 更多