Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在没有sprintf或strcpy的情况下将字符串分配给char数组_C_Arrays_String_Pointers_Char - Fatal编程技术网

如何在没有sprintf或strcpy的情况下将字符串分配给char数组

如何在没有sprintf或strcpy的情况下将字符串分配给char数组,c,arrays,string,pointers,char,C,Arrays,String,Pointers,Char,有没有一种方法可以不使用sprintf或strcpy?您可以这样做 char array[12]; sprintf(array, "%s %s", "Hello", "World"); printf(array); // prints "Hello World" 尽管我不能理解你的真正意思,但从你的标题,我理解你问如何给字符串赋值。因此,我将编写它的代码。我希望有帮助 char array[] = "Hello World"; 也可以指定多个值,如: char array[] = "Hell

有没有一种方法可以不使用
sprintf
strcpy
?您可以这样做

char array[12];
sprintf(array, "%s %s", "Hello", "World");
printf(array); // prints "Hello World"

尽管我不能理解你的真正意思,但从你的标题,我理解你问如何给字符串赋值。因此,我将编写它的代码。我希望有帮助

char array[] = "Hello World";
也可以指定多个值,如:

char array[] = "Hello World!";
可以一直走到最后一点。 但是它们是静态的,您将无法使用strcpy复制它们。如果需要,必须使用malloc,这是字符串数组的内存分配。

不能直接将字符串分配给数组,但可以从字符串文本初始化数组:

char array[12];
array[0]="H";
array[1]="e";
如果以后要将不同的字符串存储到
数组
,则必须使用以下字符串复制功能:

char array[] = "Hello World";  // this defines array with a size of 12 bytes
或者,您可以一次分配一个字符:

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

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

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

printf("%s\n", array);
const char*s1=“你好”;
const char*s2=“世界”;
chars[12];
int i;
对于(i=0;i<5;i++){
s[i]=s1[i];
}
s[i++]='';
对于(i=0;i<5;i++){
s[i+6]=s2[i];
}
s[i+6]='\0';
如果是类似于命令行参数的情况,其中有一个带有计数的指针数组,则可以使用一对嵌套循环:

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[]={
“你好”,
“世界”,
无效的
};
int argc=2;
chars[12];
int i,j,k;
j=0;
对于(k=0;k
将字符串分配给数组的方法:

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

数组[0]='H';数组[1]=“e”;/*…*/数组[11]=0strcpy有什么问题?
循环或多或少是sprintf在引擎盖下所做的。
printf(数组)是不好的做法,顺便说一句。如果
array
中有个百分号怎么办?使用
fput(数组、标准输出)
printf(“%s”,数组)而是将字符串打印到标准输出。循环如何?因此,基本上,没有strcpy和snprintf是不可能的,因为分配每个char值不是一种方便的方法。谢谢回复!您正在为数组的元素0和1分配字符串指针。嗯,有点,因为它们很可能不适合它们。这不是任务,这是一个问题initialization@chqrlie. 谢谢你的接球。我相信我已经修好了。我很感激在我无法做到的时候进行调试。这只是一种复杂且完全不安全的避免strcpy的方法,所以它是毫无意义的。如果您在使用memcpy的过程中稍作更改,那么就可以避免使用memset。@Jabberwocky,OP会询问如何在不使用strcpy()的情况下使用它,这正是我提供的答案,因此这个答案正好回答了OPs的问题。因此,这并非毫无意义。我从来没有说过这是一种“安全”的方法,我们不应该在这里给出糟糕的建议。@Jabberwocky,我可以通过以下方式声明数组:
char array[MAX_LEN]={\0'}+
运算符。我可以做到,但为什么?
#define MAX_LEN 12

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