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