strcat не влияет на глобальную строку - PullRequest
0 голосов
/ 30 декабря 2018

я пытаюсь добавить строки различной длины в конец строки, и она не ведет себя так, как я ожидал.глобальная строка остается пустой после завершения функции 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 голосов
/ 30 декабря 2018

У вас есть два способа изменить 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;
}
0 голосов
/ 30 декабря 2018

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