【问题标题】:How to change newline character with one space when concatenating strings in C?在C中连接字符串时如何用一个空格更改换行符?
【发布时间】:2020-05-23 17:49:30
【问题描述】:

首先,我必须提到,我只是作为初学者学习 C 中的字符串。 我想要做的是从用户那里获取 2 个字符串作为输入并将它们连接起来。所以这就是我所做的:

char firststring[40], secondstring[40];

printf ("Enter first string: ");
fgets (firststring, 40, stdin);
printf ("Enter second string: ");
fgets (secondstring, 40, stdin);

strcat(firststring, secondstring);
printf("%s", firststring);

问题在于,当用户输入第一个字符串时,fgets 也会读取换行符,因此输出如下所示:

Hello World

我尝试使用puts 代替 fgets 并且效果很好,但是太多人说不要使用该功能。然后我发现我可以在第一个fgets 之后使用strcspn 来删除换行符,但这并没有给我想要的单词之间的一个空格。 所需输出:Hello World 我得到了什么:HelloWorld

有什么建议吗?

【问题讨论】:

  • 啊。知道了。太感谢了。我不太明白 strcspn 是如何工作的,所以我想不出那样使用它。

标签: c concatenation newline fgets c-strings


【解决方案1】:

你可以这样做

printf ("Enter first string: ");
fgets (firststring, 40, stdin);
printf ("Enter second string: ");
fgets (secondstring, 40, stdin);

size_t n = strcspn( firststring, "\n" );
firststring[n] = ' ';
strcpy( firststring + n + 1, secondstring );

前提是 firststring 有足够的空间来追加存储在数组 secondstring 中的字符串。

这是一个演示程序

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

int main(void) 
{
    enum { N = 40 };
    char firststring[N], secondstring[N];

    printf( "Enter first string: " );
    fgets( firststring, N, stdin );

    printf( "Enter second string: " );
    fgets( secondstring, N, stdin );

    size_t n = strcspn( firststring, "\n" );
    firststring[n] = ' ';

    strcpy( firststring + n + 1, secondstring );

    puts( firststring );

    return 0;
}

它的输出可能看起来像

Enter first string: Hello
Enter second string: World!
Hello World!

fgets 调用输入的字符串中删除换行符的一般方法如下

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

【讨论】:

  • 您可能希望使firststring 更大以避免strcpy( firststring + n + 1, secondstring ); 中潜在的未定义行为
  • 这就是我最初删除新行的方式。谢谢你的回答
  • 使用#define N 40不是比enum { N = 40 };更好吗?
  • @intmain 更糟糕的是因为宏没有作用域。
猜你喜欢
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 2018-09-23
  • 2017-12-30
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
相关资源
最近更新 更多