为什么这个程序没有';不打印连接的字符串? 连接字符串的代码 #包括 char*concat(char*p1,char*)//功能去重 内部主(空) { 字符a[100],b[100],*q=NULL;//声明两个字符数组 printf(“输入str1:”); scanf(“%s”,a); printf(“输入str2:”); scanf(“%s”,b); q=concat(a,b);//调用str-concat函数 printf(“连接的str:%s\n”,q); 返回0; } char*concat(char*p1,char*p2)//连接字符串的函数 { 而(*p1!='\0') p1++; 而(*p2!='\0') { *p1=*p2; p1++; p2++; } *p1='\0'; printf(“连接的str=%s\n”,p1);//打印连接的字符串 return p1;//返回被调用函数的指针 }

为什么这个程序没有';不打印连接的字符串? 连接字符串的代码 #包括 char*concat(char*p1,char*)//功能去重 内部主(空) { 字符a[100],b[100],*q=NULL;//声明两个字符数组 printf(“输入str1:”); scanf(“%s”,a); printf(“输入str2:”); scanf(“%s”,b); q=concat(a,b);//调用str-concat函数 printf(“连接的str:%s\n”,q); 返回0; } char*concat(char*p1,char*p2)//连接字符串的函数 { 而(*p1!='\0') p1++; 而(*p2!='\0') { *p1=*p2; p1++; p2++; } *p1='\0'; printf(“连接的str=%s\n”,p1);//打印连接的字符串 return p1;//返回被调用函数的指针 },c,C,//虽然逻辑是正确的,但它没有显示输出。 //为什么此代码不起作用?您返回的是未指向连接字符串开头的p1。您只需保存原件并将其返回即可 char *concat(char *p1,char *p2) //function to concatenate strings { char *org = p1; ... return org; } 返回的是p1,它不指向连接字符串的开头。您只需保存原件并将其返回即可 char *concat(char

//虽然逻辑是正确的,但它没有显示输出。
//为什么此代码不起作用?

您返回的是未指向连接字符串开头的
p1
。您只需保存原件并将其返回即可

   char *concat(char *p1,char *p2) //function to concatenate strings
    {
    char *org = p1;

    ...
    return org;
    }

返回的是
p1
,它不指向连接字符串的开头。您只需保存原件并将其返回即可

   char *concat(char *p1,char *p2) //function to concatenate strings
    {
    char *org = p1;

    ...
    return org;
    }
您可以尝试以下方法:

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

#define MAXCHAR 100

void trim_newline(char *str);
char *concatenate(const char *str1, const char *str2);
void exit_if_null(void *ptr, const char *msg);

int
main(void) {
    char str1[MAXCHAR], str2[MAXCHAR];
    char *concat;

    printf("Enter str1: ");
    if (fgets(str1, MAXCHAR, stdin) != NULL) {
        trim_newline(str1);
    }

    printf("Enter str2: ");
    if (fgets(str2, MAXCHAR, stdin) != NULL) {
        trim_newline(str2);
    }

    concat = concatenate(str1, str2);

    printf("Concatenated str:%s\n",concat);

    free(concat);

    return 0;
}

void
trim_newline(char *str) {
    int length = strlen(str) - 1;

    if (str[length] == '\n') {
        str[length] = '\0';
    }
}

char 
*concatenate(const char *str1, const char *str2) {
    char *result;

    result = malloc(strlen(str1) + strlen(str2) + 1);
    exit_if_null(result, "Initial Allocation");

    strcpy(result, str1);
    strcat(result, str2);

    return result;
}

void
exit_if_null(void *ptr, const char *msg) {
    if (!ptr) {
        printf("Unexpected null pointer: %s\n", msg);
        exit(EXIT_FAILURE);
    }
}
#包括
#包括
#包括
#定义MAXCHAR 100
无效修剪新行(char*str);
字符*串联(常量字符*str1,常量字符*str2);
如果无效,则无效退出(无效*ptr,常量字符*msg);
int
主(空){
字符str1[MAXCHAR],str2[MAXCHAR];
炭*贝壳;
printf(“输入str1:”);
if(fgets(str1、MAXCHAR、stdin)!=NULL){
修剪新线(str1);
}
printf(“输入str2:”);
if(fgets(str2、MAXCHAR、stdin)!=NULL){
修剪新线(str2);
}
concat=串联(str1,str2);
printf(“连接的str:%s\n”,concat);
免费(concat);
返回0;
}
无效的
修剪新行(字符*str){
整数长度=strlen(str)-1;
如果(str[length]='\n'){
str[length]='\0';
}
}
烧焦
*连接(常量字符*str1,常量字符*str2){
字符*结果;
结果=malloc(strlen(str1)+strlen(str2)+1);
如果为空,则退出(结果为“初始分配”);
strcpy(结果,str1);
strcat(结果,str2);
返回结果;
}
无效的
如果为空,则退出(void*ptr,const char*msg){
如果(!ptr){
printf(“意外的空指针:%s\n”,msg);
退出(退出失败);
}
}
您可以尝试以下方法:

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

#define MAXCHAR 100

void trim_newline(char *str);
char *concatenate(const char *str1, const char *str2);
void exit_if_null(void *ptr, const char *msg);

int
main(void) {
    char str1[MAXCHAR], str2[MAXCHAR];
    char *concat;

    printf("Enter str1: ");
    if (fgets(str1, MAXCHAR, stdin) != NULL) {
        trim_newline(str1);
    }

    printf("Enter str2: ");
    if (fgets(str2, MAXCHAR, stdin) != NULL) {
        trim_newline(str2);
    }

    concat = concatenate(str1, str2);

    printf("Concatenated str:%s\n",concat);

    free(concat);

    return 0;
}

void
trim_newline(char *str) {
    int length = strlen(str) - 1;

    if (str[length] == '\n') {
        str[length] = '\0';
    }
}

char 
*concatenate(const char *str1, const char *str2) {
    char *result;

    result = malloc(strlen(str1) + strlen(str2) + 1);
    exit_if_null(result, "Initial Allocation");

    strcpy(result, str1);
    strcat(result, str2);

    return result;
}

void
exit_if_null(void *ptr, const char *msg) {
    if (!ptr) {
        printf("Unexpected null pointer: %s\n", msg);
        exit(EXIT_FAILURE);
    }
}
#包括
#包括
#包括
#定义MAXCHAR 100
无效修剪新行(char*str);
字符*串联(常量字符*str1,常量字符*str2);
如果无效,则无效退出(无效*ptr,常量字符*msg);
int
主(空){
字符str1[MAXCHAR],str2[MAXCHAR];
炭*贝壳;
printf(“输入str1:”);
if(fgets(str1、MAXCHAR、stdin)!=NULL){
修剪新线(str1);
}
printf(“输入str2:”);
if(fgets(str2、MAXCHAR、stdin)!=NULL){
修剪新线(str2);
}
concat=串联(str1,str2);
printf(“连接的str:%s\n”,concat);
免费(concat);
返回0;
}
无效的
修剪新行(字符*str){
整数长度=strlen(str)-1;
如果(str[length]='\n'){
str[length]='\0';
}
}
烧焦
*连接(常量字符*str1,常量字符*str2){
字符*结果;
结果=malloc(strlen(str1)+strlen(str2)+1);
如果为空,则退出(结果为“初始分配”);
strcpy(结果,str1);
strcat(结果,str2);
返回结果;
}
无效的
如果为空,则退出(void*ptr,const char*msg){
如果(!ptr){
printf(“意外的空指针:%s\n”,msg);
退出(退出失败);
}
}

在您的
concat
函数中,当您执行
返回p1
时,
*p1
的值是多少?@gsamaras不是很糟糕,
p1
仍然指向一个有效字符串。是的@Someprogrammerdude,但不是他想要的字符串;)调试器将在
concat
函数中很好地回答您的问题,当您执行
返回p1
时,
*p1
的值是多少?@gsamaras不是很糟糕,
p1
仍然指向有效字符串。是的@Someprogrammerdude,但不是他想要的字符串;)调试器将非常准确地回答您的问题。然而,建议OP使用一张纸,画出他所做的代码,这将是一件好事!很明显……他会学会的请注意,您的函数遇到了标准的
strcat()
函数所遇到的问题。然而,建议OP使用一张纸,画出他所做的代码,这将是一件好事!很明显……他会学会的请注意,您的函数遇到了标准
strcat()函数所遇到的问题。