鱼C论坛

 找回密码
 立即注册
查看: 985|回复: 3

[已解决]求助 关于指针

[复制链接]
发表于 2020-3-6 20:31:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

#define MAX 128

int main()
{
        char str1[MAX];
        char str2[MAX];
        char *p1, *p2;
        int num1,num2;

        printf("请输入第一个字符串:");
        fgets(str1,MAX,stdin);

        printf("请输入第二个字符串:");
        fgets(str2,MAX,stdin);

        p1 = str1;
        p2 = str2;

        num1 = strlen(p2);
        num2 = strlen(p1);

//        p1 = p1 + num2;

        strncat(str1,str2,num2);


        printf("%s\n",p1);

        return 0;

}

最后无法将两个输入的字符串连接起来,会有一个换行符号,这个应该怎么解决

这是输出的结果
请输入第一个字符串:www.
请输入第二个字符串:fishc
www.
fishc
最佳答案
2020-3-6 21:21:58
本帖最后由 major_lyu 于 2020-3-6 21:24 编辑

fgets在读入字符串时不会忽略回车符。所以你用fgets读入的str1和str2末尾都是有一个回车的。
实际上你这个拼接已经完成了。
你想去掉str1后面的的回车的话,可以在拼接前强制将最后一个回车符换成‘'\0';
在strncat()那一句之前加上。
*(p1+num2-1) = '\0';

或者用scanf("%s“)读入字符串,这样会自动忽略末尾的回车。


另外,你这strncat第三个参数似乎不对吧,应该是需要拷贝到目标字符串的长度,要将第二个字符串全部续借到第一个字符串,第三个参数应该是第二个字符串的长度。

你这num1是第二个字符串的长度,num2是第一个字符串的长度。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-6 21:21:58 | 显示全部楼层    本楼为最佳答案   
本帖最后由 major_lyu 于 2020-3-6 21:24 编辑

fgets在读入字符串时不会忽略回车符。所以你用fgets读入的str1和str2末尾都是有一个回车的。
实际上你这个拼接已经完成了。
你想去掉str1后面的的回车的话,可以在拼接前强制将最后一个回车符换成‘'\0';
在strncat()那一句之前加上。
*(p1+num2-1) = '\0';

或者用scanf("%s“)读入字符串,这样会自动忽略末尾的回车。


另外,你这strncat第三个参数似乎不对吧,应该是需要拷贝到目标字符串的长度,要将第二个字符串全部续借到第一个字符串,第三个参数应该是第二个字符串的长度。

你这num1是第二个字符串的长度,num2是第一个字符串的长度。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 21:38:53 | 显示全部楼层
fgets 函数最多可以读取 size - 1 个字符,因为结尾处会自动添加一个字符串结束符 '\0'。当读取到换行符('\n')或文件结束符(EOF)时,表示结束读取('\n' 会被作为一个合法的字符读取)
所以输出的时候会分行。
我上传的这段代码也有缺陷,测试了好长时间,要想输出完整的连接后的句子需要在第一个句子后面后面追加空格。
#include <stdio.h>
#include <string.h>

#define MAX 128

int main()
{
    char str1[MAX];
    char str2[MAX];
    char *p1, *p2;
    int num1,num2;

    printf("请输入第一个字符串:");
    fgets(str1,MAX,stdin);
    

    printf("请输入第二个字符串:");
    fgets(str2,MAX,stdin);

    p1 = str1;
    p2 = str2;        

    num1 = strlen(p1);
    num2 = strlen(p2);

        
        str1[num1-1]='\b';
    strncat(str1,str2,num2);


    printf("%s\n",str1);

    return 0;

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 22:06:33 | 显示全部楼层
百度来的一些资料:fgets()函数读取到它所遇到的第一个换行符的后面,或者读取比字符串的最大长度少一个的字符,或者读取到文件结尾。然后fgets()函数向末尾添加一个空字符以构成一个字符串。如果在达到字符最大数目之前读完一行,它将在字符串的空字符之前添加一个换行符以标识一行结束。
问题出在有时字符串的结尾处可能多出一个换行符,我们需要把它去掉。

                               
登录/注册后可看大图

查看汇编代码也会发现多了一个0xA,这个对应的ascii码就是换行符,所以要去掉
我的解法直接用指针处理下得了
int main()
{
        char str1[MAX];
        char str2[MAX];
        char *p1, *p2;
        int num1, num2,i;

        printf("请输入第一个字符串:");
        fgets(str1, MAX, stdin);

        printf("请输入第二个字符串:");
        fgets(str2, MAX, stdin);

        p1 = str1;
        p2 = str2;
        num1 = strlen(p1);
        num2 = strlen(p2);
        /*
        num1 = strlen(p2);
        num2 = strlen(p1);

        //        p1 = p1 + num2;

        strncat(str1, str2, num2);
        
        */
        
        for ( i = 0; i < num2-1; i++) {
                *(p1 + num1 - 1 + i) = *(p2 + i);
                printf("%c\n", *(p2 + i));

        }
        *(p1 + num1 - 1 + i) = '\0';

        printf("%s\n", p1);

        return 0;

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 23:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表