Mr丶张 发表于 2020-3-6 20:31:39

求助 关于指针

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

#define MAX 128

int main()
{
        char str1;
        char str2;
        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

major_lyu 发表于 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是第一个字符串的长度。

良弓无箭 发表于 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;
    char str2;
    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='\b';
    strncat(str1,str2,num2);


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

    return 0;

}

4goodworld 发表于 2020-3-6 22:06:33

百度来的一些资料:fgets()函数读取到它所遇到的第一个换行符的后面,或者读取比字符串的最大长度少一个的字符,或者读取到文件结尾。然后fgets()函数向末尾添加一个空字符以构成一个字符串。如果在达到字符最大数目之前读完一行,它将在字符串的空字符之前添加一个换行符以标识一行结束。
问题出在有时字符串的结尾处可能多出一个换行符,我们需要把它去掉。
https://xxx.ilovefishc.com/forum/202003/06/153706an7doy2gine8ia8d.png.thumb.jpg
查看汇编代码也会发现多了一个0xA,这个对应的ascii码就是换行符,所以要去掉
我的解法直接用指针处理下得了
int main()
{
        char str1;
        char str2;
        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;

}
页: [1]
查看完整版本: 求助 关于指针