2

如何组合多个字符串。例如,

char item[32];
scanf("%s", item);
printf("Shopping list: %s\n", item); //I want to combine this string 
char string_2[] = "To do list: Sleep\n"; // with this string 
char hw[32];
scanf("%s", hw); 
printf("Homework: %s\n", hw); // and this string

所以他们会像下面这样打印,

购物清单:(项目)

待办事项清单:睡觉

作业:(hw)


但是我不想像上面的代码那样单独给 printf 命令,而是结合字符串并在最后调用 printf /


我将如何做到这一点,因为我无法将这样的内容保存到单独的字符串中,char string1 = ("Shopping list: %s \n", item)

4

6 回答 6

2

您最好使用函数连接字符串。strcat

但请确保您连接的目标字符串足够大以适合所有内容(包括终止'\0'字符)。

于 2012-10-08T05:56:15.837 回答
2

使用strcpystrcat

char item[] = "Shopping list";
char hw[] = "To do list: Sleep \n";
char* itemhw;
itemhw = malloc(strlen(item)+strlen(hw)+1);
strcpy(itemhw, item);
strcat(itemhw, hw); 
free(itemhw);
于 2012-10-08T05:59:06.470 回答
1

您可以使用sprintf

char combinedstring[100];
sprintf(combinedstring,"%s %s %s",item,string_2,hw);

您还可以查找string.h标题及其功能。

于 2012-10-08T05:55:32.203 回答
1

在 C 中处理原始字符串总是很丑陋。您必须执行两个步骤来连​​接字符串:

  1. 为新字符串分配内存。

  2. 将源字符串复制到新缓冲区中。

作为一个教训,请注意这个问题已经有三个不同的答案,三个不同的缓冲区溢出错误。

这是一个连接两个字符串并返回一个新字符串的函数:

char *astrcat(const char *x, const char *y)
{
    size_t nx = strlen(x), ny = strlen(y);
    char *z = malloc(nx + ny + 1);
    if (!z)
        return NULL;
    memcpy(z, x, nx);
    memcpy(z + nx, y, ny + 1);
    return z;
}

您可以将其扩展为使用三个字符串,或者您可以调用它两次。理智的人倾向于使用库或广泛使用固定大小的缓冲区。

替代方案: 使用固定大小的缓冲区和snprintf,您可以获得安全性和易用性,但您会遇到固定大小的缓冲区。

const char *x = ..., *y = ...;
char buf[100];
snprintf(buf, sizeof(buf), "%s%s", x, y);

如果您没有snprintf,那么您可能正在使用 MSVC,它_snprintf几乎相同,但并不总是终止输出。

不要使用strcator strcpy在极少数情况下strcat可以接受:

char buf[100];
strcpy(buf, x); // buffer overflow
strcat(buf, y); // buffer overflow

不要使用sprintf它也会溢出:

char buf[100];
sprintf(buf, "%s%s", x, y); // buffer overflow
于 2012-10-08T06:07:13.710 回答
1

我将要忽略多个问题(输入和输出的排序;输入的错误处理;输入缓冲区溢出;条目中的单个单词与多个单词等),但是:

char item[32];
scanf("%s", item);
char hw[32];
scanf("%s", hw);
char string_2[] = "To do list: Sleep\n";

printf("Shopping list: %s\n%sHomework: %s\n", item, string_2, hw);

这为您提供了一个printf()提供串联输出的语句。显然,连接是在输出文件(标准输出)上而不是直接在内存中。如果您希望将字符串连接到内存中,那么您必须通过一些机制来确保有足够的内存可以复制到其中,但是您可以将其snprintf()用于该作业,而不是printf()

char item[32];
scanf("%s", item);
char hw[32];
scanf("%s", hw);
char string_2[] = "To do list: Sleep\n";

// This length does account for two extra newlines and a trailing null
size_t totlen = strlen(item) + strlen(homework) + sizeof(string_2) +
                sizeof("Shopping list: ") + sizeof("Homework: ");
char *conc_string = malloc(totlen);

snprintf(conc_string, totlen, "Shopping list: %s\n%sHomework: %s\n",
         item, string_2, hw);
于 2012-10-08T06:11:57.507 回答
0

考虑使用伟大但未知的 open_memstream() 函数。

FILE *open_memstream(char **ptr, size_t *sizeloc);

用法示例:

// open the stream
FILE *stream;
char *buf;
size_t len;
stream = open_memstream(&buf, &len);

// write what you want with fprintf()
char item[32];
scanf("%s", item);
fprintf(stream, "Shopping list: %s\n", item);
char string_2[] = "To do list: Sleep\n";
fprintf(stream, "%s\n", string_2);
char hw[32];
scanf("%s", hw); 
fprintf(stream, "Homework: %s\n", hw);

// close the stream, the buffer is allocated and the size is set !
fclose(stream);
printf ("the result is '%s' (%d characters)\n", buf, len);
free(buf);

让内核管理缓冲区分配,它比你做得更好!

于 2017-08-29T09:18:39.923 回答