在C中正确使用%s-非常基本的级别

在C中正确使用%s-非常基本的级别,c,C,我知道%s是一个字符串,但我不知道如何使用它。 谁能给我提供一个非常基本的例子,说明它是如何使用的,它与char有什么不同 (编辑) 这门课我已经上了两周了,这是我第一次编程。我不允许使用作业中还没有教过的材料,所以这就是我问的原因。我有几本关于C语言的书,在谷歌上搜索过,但还是不确定,所以我问。(感谢所有的反对票)下面给出的所有示例都使用了尚未教授的数组,因此我假设我也不能使用%s。谢谢 下面是: char str[] = "This is the end"; char input[100]

我知道%s是一个字符串,但我不知道如何使用它。 谁能给我提供一个非常基本的例子,说明它是如何使用的,它与char有什么不同


(编辑)

这门课我已经上了两周了,这是我第一次编程。我不允许使用作业中还没有教过的材料,所以这就是我问的原因。我有几本关于C语言的书,在谷歌上搜索过,但还是不确定,所以我问。(感谢所有的反对票)下面给出的所有示例都使用了尚未教授的数组,因此我假设我也不能使用%s。谢谢

下面是:

char str[] = "This is the end";
char input[100];

printf("%s\n", str);
printf("%c\n", *str);

scanf("%99s", input);

%s将获取所有值,直到其为NULL,即“\0”

char str1[] = "This is the end\0";
printf("%s",str1);
将给予

结束了

char str2[] = "this is\0 the end\0";
printf("%s",str2);
将给予


这是

%s是字符数组的表示形式

char string[10] // here is a array of chars, they max length is 10;
char character; // just a char 1 letter/from the ascii map

character = 'a'; // assign 'a' to character
printf("character %c  ",a); //we will display 'a' to stout
所以字符串是一个字符数组,我们可以为每个内存空间分配多个字符

string[0]='h';
string[1]='e';
string[2]='l';
string[3]='l';
string[4]='o';
string[5]=(char) 0;//asigning the last element of the 'word' a mark so the string ends
此分配可以在初始化时完成,如 char word=“这是一个单词”//字符的单词数组现在得到了这个字符串,并且是静态定义的

toy还可以为字符数组赋值,并使用strcpy等函数赋值

strcpy(string,"hello" );
这样做与示例相同,并在末尾自动添加(char)0

所以如果你用%S打印它 printf(“我的字符串%s”,字符串)

字符串是一个数组,我们可以显示它的一部分

//                         the array    one char
printf("first letter of wrd %s     is    :%c ",string,string[1]  );

对于
*printf
*scanf
%s
希望相应的参数类型为
char*
,对于
scanf
,最好指向可写缓冲区(即,不是字符串文字)

scanf
中使用
%s
而不使用显式字段宽度会打开与
获得的
相同的缓冲区溢出漏洞;也就是说,如果输入流中的字符数超过了目标缓冲区所能容纳的大小,
scanf
将很高兴地将这些额外的字符写入缓冲区外的内存,这可能会破坏一些重要的内容。不幸的是,与
printf
不同,您不能将以下内容作为运行时参数提供给字段:

printf("%*s\n", field_width, string);
一个选项是动态构建格式字符串:

char fmt[10];
sprintf(fmt, "%%%lus", (unsigned long) (sizeof str_buf) - 1);
...
scanf(fmt, target_buffer); // fmt = "%55s"
编辑

使用带有
%s
转换说明符的
scanf
将在第一个空白字符处停止扫描;例如,如果您的输入流看起来像

"This is a test"

然后
scanf(“%55s”,str_buf)
将读取
“This”
并将其分配给
str_buf
。请注意,在这种情况下,带说明符的字段没有任何区别。

可能重复的@nofe
%c
用于单个字符,而
%s
用于以null结尾的一系列字符。你到底不明白什么?
char fmt[10];
sprintf(fmt, "%%%lus", (unsigned long) (sizeof str_buf) - 1);
...
scanf(fmt, target_buffer); // fmt = "%55s"
"This is a test"