strcat不影响全局字符串

时间:2018-12-30 07:07:50

标签: c c-strings strcat

im试图将不同长度的字符串添加到字符串的末尾,并且行为不如我期望的那样。 addToString函数结束后,全局字符串将保持为空

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

char * string = "";

void addToString(char * string,char* arg){
  unsigned int new_string_len = strlen(string) + strlen(arg);
  if(strlen(string) == 0){
    string = malloc(strlen(arg) + 1);
    strncat(string,arg,strlen(arg) + 1);
    printf("%lu %s \n",strlen(string),string);
  }
  else{
    string = realloc(string,new_string_len);
    strncat(string,arg,new_string_len);
  }
}

int main(){
  for(int i = 0; i < 3; i++){
    addToString(string,"boop");
    printf("%s",string);
  }
  printf("%lu %s \n",strlen(string),string);
  return 0;
}

2 个答案:

答案 0 :(得分:0)

string是一个全局变量(更严格地说是一个非静态变量),它允许每个函数(在与之链接的每个文件中)都可以访问它。这意味着每个函数(即addString()main())在此情况下都是隐式看到的。您无需显式将其作为参数传递。

删除addString中的第一个参数,它会串联在一起。 即您的新addString方法是:

char * string = "";

void addToString(char* arg){
     // the same code as before, unmodified.
}

int main(){
  for(int i = 0; i < 3; i++){
    addToString("boop");
    printf("%s",string);
  }
  printf("%lu %s \n",strlen(string),string);
  return 0;
}

答案 1 :(得分:0)

您有两种修改string变量的方法,它们要么传递变量的地址,要么因为它是全局变量,所以不要将其传递给参数。以下代码分别显示了我的意思,

由于全局变量,无需传递

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

char * string = "";

void addToString(char* arg){
    unsigned int new_string_len = strlen(string) + strlen(arg) + 1;
    if(strlen(string) == 0){
        string = malloc(strlen(arg) + 1);
        strncat(string,arg,strlen(arg) + 1);
        printf("%lu %s \n",strlen(string),string);
    }
    else{
        string = realloc(string,new_string_len);
        strncat(string,arg,new_string_len);
    }
}

int main(){
    for(int i = 0; i < 3; i++){
        addToString("boop");
        printf("%s",string);
    }
    printf("%lu %s \n",strlen(string),string);
    free(string);
    return 0;
}

传递地址,

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

//char * string = "";

void addToString(char ** string,char* arg){
    unsigned int new_string_len = strlen(string) + strlen(arg) + 1;
    if(strlen(*string) == 0){
        *string = malloc(strlen(arg) + 1);
        strncat(*string,arg,strlen(arg) + 1);
        printf("%lu %s \n",strlen(*string),*string);
    }
    else{
        *string = realloc(*string,new_string_len);
        strncat(*string,arg,new_string_len);
    }
}

int main(){
    char * string = "";
    for(int i = 0; i < 3; i++){
        addToString(&string,"boop");
        printf("%s",string);
    }
    printf("%lu %s \n",strlen(string),string);
    free(string);
    return 0;
}