【问题标题】:How to assign a string to a char array without sprintf or strcpy如何在没有 sprintf 或 strcpy 的情况下将字符串分配给 char 数组
【发布时间】:2020-05-10 20:34:51
【问题描述】:
char array[12];
sprintf(array, "%s %s", "Hello", "World");
printf(array); // prints "Hello World"

有没有办法在不使用sprintfstrcpy 的情况下做到这一点?

【问题讨论】:

  • array[0]='H'; array[1]='e'; /*...*/ array[11]=0;
  • strcpy 有什么问题?
  • 循环或多或少是 sprintf 在后台所做的。
  • printf(array); 是不好的做法,顺便说一句。如果array 中有一个百分号怎么办?改用fputs(array, stdout);printf("%s", array); 将字符串打印到标准输出。

标签: c arrays string pointers char


【解决方案1】:

你可以的

char array[] = "Hello World";

【讨论】:

  • 这不是赋值,是初始化
【解决方案2】:

你不能将一个字符串直接赋值给一个数组,但是你可以从一个字符串字面量初始化一个数组:

char array[] = "Hello World";  // this defines array with a size of 12 bytes

如果您以后想将不同的字符串存储到array,则必须使用字符串复制功能,例如:

strcpy(array, "Hello Buddy");      // assuming array has at least 12 bytes
memcpy(array, "Hello Buddy", 12);  // assuming array has at least 12 bytes
snprintf(array, sizeof array, "%s %s", "Hello", "Buddy");

或者您可以一次分配一个字符:

array[6] = 'B';
array[7] = 'u';
array[8] = 'd';
array[9] = 'd';
array[10] = 'y';
array[11] = '\0';

请注意,最好使用snprintf 而不是sprintf 以避免潜在的缓冲区溢出。还要避免将变量数组传递给printf,如果它包含% 字符,这将导致未定义的行为。始终使用常量格式字符串:

printf("%s\n", array);

【讨论】:

  • 一个循环怎么样?
  • 因此,基本上,这是不可能的(没有 strcpy 和 snprintf),因为分配每个 char 值不是一种方便的方法。谢谢回复!
【解决方案3】:

给定两个字符串和一个足以容纳两者的缓冲区,您可以使用循环来复制内容:

const char *s1 = "Hello";
const char *s2 = "World";
char s[12];

int i;

for(i = 0; i < 5; i++) {
    s[i] = s1[i];
}
s[i++] = ' ';
for(i = 0; i < 5; i++) {
    s[i + 6] = s2[i];
}
s[i + 6] = '\0';

如果是像命令行参数这样的情况,你有一个带有计数的指针数组,你可以对整个事情使用一对嵌套循环:

char *argv[] = {
    "Hello",
    "World",
    NULL
};
int argc = 2;

char s[12];

int i, j, k;

j = 0;
for(k = 0; k < argc; k++) {
    for(i = 0; argv[k][i]; i++) {
        s[j++] = argv[k][i];
    }
    s[j++] = ' ';
}
if(k) {
    s[--j] = '\0';
} else {
    s[0] = '\0';
}

【讨论】:

  • @chqrlie。谢谢你的收获。我相信我已经修复了它们。我很感激在我无法调试的时候进行调试。
【解决方案4】:

一种将字符串分配给数组的方法:

#define MAX_LEN 12

int main( void )
{
    ...
    char array[ MAX_LEN ];
    ...
    memset( array, '\0', MAX_LEN );
    memcpy( array, "hello world", strlen( "hello world" ) );

【讨论】:

  • 这只是一种复杂且完全不安全的方式来避免 strcpy,所以它毫无意义。并且可以避免使用 memset,只要您使用 memcpy 对行稍作更改。
  • @Jabberwocky,OP 询问如何在不使用strcpy() 的情况下做到这一点,这正是我提供的,所以这个答案正好回答了 OP 的问题。所以这不是没有意义的。我从未表示这是一种“安全”的方法
  • 我们不应该在这里给出糟糕的建议。
  • @Jabberwocky,我本可以通过:char array[ MAX_LEN ] = {\0'}; 声明数组,但为了灵活性/可重用性,决定不这样做。
  • 我的意思是不使用strcpy 是一个糟糕的选择。他的问题是,我想添加两个数字,但我不想使用 + 运算符。我可以完成,但是为什么呢?
【解决方案5】:

尽管我无法理解您的真正意思,但从您的标题中,我了解到您询问如何为字符串赋值。因此,我将编写它的代码。希望对你有帮助。

char array[] = "Hello World!";

或者您可以分配多个值,例如:

char array[12];
array[0]="H";
array[1]="e";

并且可以一直到最后一点。 但是它们将是静态的,您将无法使用 strcpy 复制它们。如果你愿意,你必须使用 malloc,它是字符串数组的内存分配。

【讨论】:

  • 您正在将指向字符串的指针分配给数组的元素 0 和 1。嗯,有点,因为它们很可能不适合它们。
猜你喜欢
  • 1970-01-01
  • 2013-03-01
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 2011-02-07
  • 1970-01-01
  • 2014-06-08
相关资源
最近更新 更多