strcat 不影响全局字符串

strcat not affecting global string

我正在尝试将不同长度的字符串添加到字符串的末尾,但它的行为并不像我期望的那样。 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;
}

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;
}

您有两种修改 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;
}