正确使用C中的%s - 非常基本的水平

时间:2012-04-02 17:24:51

标签: c

我知道%s是一串字符,但我不知道如何使用它。 任何人都可以为我提供一个非常基本的例子,说明它的使用方式以及它与char的不同之处吗?


(编辑)的

我进入这个课程已经两周了,这是我第一次编程。我不允许在作业中使用尚未教授的材料,所以这就是我问的原因。我有几本关于C的书并且用Google搜索但仍然不确定,所以我问道。 (感谢所有的下选票)下面给出的所有例子都使用了尚未教授的数组,所以我假设我还不能使用%s。谢谢。

5 个答案:

答案 0 :(得分:8)

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

char *str_constant = "I point to a string literal";
char str_buf[] = "I am an array of char initialized with a string literal";

printf("string literal = %s\n", "I am a string literal");
printf("str_constant = %s\n", str_constant);
printf("str_buf = %s\n", str_buf);

scanf("%55s", str_buf);

在没有explcit字段宽度的%s中使用scanf会打开gets所执行的缓冲区溢出漏洞。也就是说,如果输入流中的字符数多于目标缓冲区的大小以容纳,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"

修改

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

"This is a test"

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

答案 1 :(得分:4)

这里是:

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

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

scanf("%99s", input);

答案 2 :(得分:1)

void myfunc(void)
{
    char* text = "Hello World";
    char  aLetter = 'C';

    printf("%s\n", text);
    printf("%c\n", aLetter);
}

答案 3 :(得分:1)

%s将获取所有值,直到它变为NULL,即'\ 0'。

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

将给出

这是结束

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

将给出

这是

答案 4 :(得分:0)

%s是char

数组的表示
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是一个char数组,我们可以为每个内存空间分配多个字符

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 =“这是一个单词”//字符数组字符现在得到这个字符串并且是静态定义的

玩具还可以为字符数组赋值,并使用strcpy;

等函数为其分配
strcpy(string,"hello" );

这与示例相同,并在末尾自动添加(char)0

所以如果用%S打印它     printf(“my string%s”,string);

以及string是一个数组,我们只能显示它的一部分

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