Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中连接字符串时,如何用一个空格更改换行符?_C_Concatenation_Newline_Fgets_C Strings - Fatal编程技术网

在C中连接字符串时,如何用一个空格更改换行符?

在C中连接字符串时,如何用一个空格更改换行符?,c,concatenation,newline,fgets,c-strings,C,Concatenation,Newline,Fgets,C Strings,首先,我必须提到,作为一名初学者,我正在学习C语言中的字符串。 我想做的是从用户那里获取两个字符串作为输入,并将它们连接起来。以下是我所做的: char firststring[40], secondstring[40]; printf ("Enter first string: "); fgets (firststring, 40, stdin); printf ("Enter second string: "); fgets (secondstring, 40, stdin); strc

首先,我必须提到,作为一名初学者,我正在学习C语言中的字符串。 我想做的是从用户那里获取两个字符串作为输入,并将它们连接起来。以下是我所做的:

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还会读取换行符,因此输出如下所示:

你好 世界

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


有什么建议吗?

你可以用以下方法

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 );
前提是第一个字符串有足够的空间附加存储在数组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;
}
从调用
fgets
输入的字符串中删除新行字符的一般方法如下

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

啊。知道了。非常感谢你。我不太明白strcspn是如何工作的,所以我想不出用那种方式。你可能想把
firststring
放大,以避免
strcpy中潜在的未定义行为(firststring+n+1,secondstring)这就是我最初删除新行的方式。感谢您的回答使用
#define n40
不是比
enum{N=40}更好吗?@intmain更糟,因为宏没有作用域。
string[ strcspn( string, "\n" ) ] = '\0';