无法从函数连接两个字符串和 return
Unable to concatenate two strings and return it from a function
以下 C 代码出现分段错误。
#include <stdio.h>
#include<string.h>
char *getSegment(char *symbol2,char *symbol3,char *filename) {
if (strcmp(symbol2,"static") == 0) return strcat(filename,symbol3);
}
int main() {
char *symbol2="static";
char *symbol3="asdf";
char *filename="zxcn";
printf("%s\n",getSegment(symbol2,symbol3,filename));
return 0;
}
我正在尝试连接两个字符串和 return 来自函数的连接字符串。
当您尝试连接到文件名时:
return strcat(filename,symbol3)
您忘记了 filename
的大小为 5
。它没有更多的 space 供您连接字符。
当你这样评价它时:
char *filename="zxcn";
它应该被分配为 const char*
。编译器应该警告你,因为写入它是 UB。相反,你应该使用一些 char[]
您的 getSegment
函数 本身 没有任何问题,只是它 return 不是有效字符串,如果比较是 not true;相反,您给了它一个无效的第三个参数(目标字符串)。
filename
变量是指向长度为 5 个字符(4 个可见字符加上 nul
终止符)的 常量 字符串文字的指针。因此,它: (a) 不可修改;和 (b),即使是,也不足以容纳串联的结果。
要解决此问题,请将 filename
声明为 非常数 字符数组,该数组的大小足以存储连接的结果。在下面的代码中,我允许最多 10 个字符(9 个加上终止符),这在您的示例中已经足够 。
要修复第一点,您需要 return 在 else
子句中添加一些内容。
#include <stdio.h>
#include<string.h>
char* getSegment(char* symbol2, char* symbol3, char* filename)
{
if (strcmp(symbol2, "static") == 0) return strcat(filename, symbol3);
else return filename; // return unmodified source string
}
int main()
{
char* symbol2 = "static";
char* symbol3 = "asdf";
char filename[10] = "zxcn"; // Both NON-CONSTANT and LARGE ENOUGH!
printf("%s\n", getSegment(symbol2, symbol3, filename));
return 0;
}
但是,请注意此处的 getSegment
函数 修改了 给定的 filename
参数(这是您的问题的原因)。如果你想让它创建一个新字符串(从串联或只是原始字符串的副本),那么你必须自己分配新字符串(并且你需要 free
main
,当你完成它时)。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* getSegment(char* symbol2, char* symbol3, char* filename)
{
if (strcmp(symbol2, "static") == 0) {
char* answer = malloc(sizeof(char) * (strlen(filename) + strlen(symbol3) + 1));
strcpy(answer, filename);
strcat(answer, symbol3);
return answer;
}
else {
return strdup(filename);
}
}
int main()
{
char* symbol2 = "static";
char* symbol3 = "asdf";
char* filename = "zxcn";
char* result = getSegment(symbol2, symbol3, filename);
printf("%s\n", result);
free(result);
return 0;
}
以下 C 代码出现分段错误。
#include <stdio.h>
#include<string.h>
char *getSegment(char *symbol2,char *symbol3,char *filename) {
if (strcmp(symbol2,"static") == 0) return strcat(filename,symbol3);
}
int main() {
char *symbol2="static";
char *symbol3="asdf";
char *filename="zxcn";
printf("%s\n",getSegment(symbol2,symbol3,filename));
return 0;
}
我正在尝试连接两个字符串和 return 来自函数的连接字符串。
当您尝试连接到文件名时:
return strcat(filename,symbol3)
您忘记了 filename
的大小为 5
。它没有更多的 space 供您连接字符。
当你这样评价它时:
char *filename="zxcn";
它应该被分配为 const char*
。编译器应该警告你,因为写入它是 UB。相反,你应该使用一些 char[]
您的 getSegment
函数 本身 没有任何问题,只是它 return 不是有效字符串,如果比较是 not true;相反,您给了它一个无效的第三个参数(目标字符串)。
filename
变量是指向长度为 5 个字符(4 个可见字符加上 nul
终止符)的 常量 字符串文字的指针。因此,它: (a) 不可修改;和 (b),即使是,也不足以容纳串联的结果。
要解决此问题,请将 filename
声明为 非常数 字符数组,该数组的大小足以存储连接的结果。在下面的代码中,我允许最多 10 个字符(9 个加上终止符),这在您的示例中已经足够 。
要修复第一点,您需要 return 在 else
子句中添加一些内容。
#include <stdio.h>
#include<string.h>
char* getSegment(char* symbol2, char* symbol3, char* filename)
{
if (strcmp(symbol2, "static") == 0) return strcat(filename, symbol3);
else return filename; // return unmodified source string
}
int main()
{
char* symbol2 = "static";
char* symbol3 = "asdf";
char filename[10] = "zxcn"; // Both NON-CONSTANT and LARGE ENOUGH!
printf("%s\n", getSegment(symbol2, symbol3, filename));
return 0;
}
但是,请注意此处的 getSegment
函数 修改了 给定的 filename
参数(这是您的问题的原因)。如果你想让它创建一个新字符串(从串联或只是原始字符串的副本),那么你必须自己分配新字符串(并且你需要 free
main
,当你完成它时)。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* getSegment(char* symbol2, char* symbol3, char* filename)
{
if (strcmp(symbol2, "static") == 0) {
char* answer = malloc(sizeof(char) * (strlen(filename) + strlen(symbol3) + 1));
strcpy(answer, filename);
strcat(answer, symbol3);
return answer;
}
else {
return strdup(filename);
}
}
int main()
{
char* symbol2 = "static";
char* symbol3 = "asdf";
char* filename = "zxcn";
char* result = getSegment(symbol2, symbol3, filename);
printf("%s\n", result);
free(result);
return 0;
}