为什么是这样的结果怎么改


#include<stdio.h>
# define words 10
char GET(char* st, int n,char* ma);
int main() {
    char ch[words];
    char str[words];
    fgets(ch, words, stdin);
    GET(ch,words,str);
    fputs(str, stdout);
}
char GET(char* st, int n,char* ma) {
    for (st; *st!=' '; st++) {
        *ma = *st;
        ma++;
    }
    return 0;
}
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/993039545886174.png "#left")

有两个原因:一是复制完成,ma结尾没加空字符,二是第13行的 *st!=' ' 没有改为第13行的 *st!='\0';

如果是要复制字符数组ch 里空格之前的字符,复制完成,在ma存储的字符结尾需要添加一个结尾的空字符即可;

但如果是要复制数组ch中全部的字符串到ma,还需要将第13行的 *st!=' ' 改为 *st!='\0'。

修改如下:


 
#include<stdio.h>
# define words 10
char GET(char* st, int n,char* ma);
int main() {
    char ch[words];
    char str[words];
    fgets(ch, words, stdin);
    GET(ch,words,str);
    fputs(str, stdout);
}
char GET(char* st, int n,char* ma) {
// 如果是要实现复制全部字符串的话,下面的*st!=' '改为 *st!='\0'即可
    for (st; *st!=' '; st++) {
        *ma = *st;
        ma++;
    }
    *ma='\0';  // 添加字符串结尾的空字符'\0'
    return 0;
}

 

img

你这代码各种指针越界

 
#include<stdio.h>
# define words 10
char GET(char* st, int n,char* ma);
int main() {
    char ch[words];
    char str[words];
    fgets(ch, words, stdin);
    GET(ch,words,str);
    fputs(str, stdout);
}
char GET(char* st, int n,char* ma) {
    for (; *st!=0; st++) {
        *ma = *st;
        ma++;
    }
    *ma=0;
    return 0;
}
 

代码问题较多,直接看修改后的结果吧,支持中文输出

#include <stdio.h>
#include <wchar.h>
#include <locale.h>
#define words 10
void GET(wchar_t *st, int n, wchar_t *ma);
int main()
{
    setlocale(LC_ALL, ""); // 设置本地化环境,支持中文字符
    wchar_t ch[words];
    wchar_t str[words];
    fgetws(ch, words - 1, stdin);
    GET(ch, words, str);
    fputws(str, stdout);
    return 0;
}
void GET(wchar_t *st, int n, wchar_t *ma)
{
    for (st = st; *st != L' ' && *st != L'\0'; st++)
    {
        *ma = *st;
        ma++;
    }
    *ma = L'\0';
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^