Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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
C 字符串如何填充数组_C_Arrays_String - Fatal编程技术网

C 字符串如何填充数组

C 字符串如何填充数组,c,arrays,string,C,Arrays,String,我正在创建一个简单的程序来查看字符串如何填充数组 #include <stdio.h> #include <string.h> #include <stddef.h> #include <stdlib.h> int main(void) { char string1[100]; int i; printf("Enter sentence.\n"); fgets(string1, 100, stdin);

我正在创建一个简单的程序来查看字符串如何填充数组

#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <stdlib.h>

int main(void)
{
    char string1[100];
    int i;

    printf("Enter sentence.\n");
    fgets(string1, 100, stdin);

    for (i=0; i<=15; i++)
       puts(&string1[i]);
    return 0;
}
#包括
#包括
#包括
#包括
内部主(空)
{
charstring1[100];
int i;
printf(“输入句子。\n”);
fgets(第1条、第100条、标准规范);
对于(i=0;i字符串不存储在string1[0]中,但是字符串的第一个字符存储在
string1[0]
中,或者字符串开始于
(string1+0)
。在这里,
&string1[0]或(string1+0)
可以看作是一个指针,一个指向C字符串的指针

从这个意义上讲,
string1
的每个有效索引
i
都将给您一个有效指针
(string1+i)
,它将指向C字符串的某个部分
string1

在最后一个for循环中,您正在打印字符串
string1
的后缀,这些后缀由
(string1+0)、(string1+1)、(string1+2)

字符串不存储在string1[0]中,但字符串的第一个字符存储在
string1[0]
中,或者字符串开始于
(string1+0)
。在这里,
&string1[0]或(string1+0)
可以看作是一个指针,一个指向C字符串
string1
的指针

从这个意义上讲,
string1
的每个有效索引
i
都将给您一个有效指针
(string1+i)
,它将指向C字符串的某个部分
string1

在最后一个for循环中,您正在打印字符串
string1
的后缀,该后缀由
(string1+0)、(string1+1)、(string1+2)

指向字符串“Hello!”,内存表示形式如下

+-------+-------+-------+-------+-------+-------+-------+
|  'H'  |  'e'  |  'l'  |  'l'  |  'o'  |  '!'  | '\0'  |
+-------+-------+-------+-------+-------+-------+-------+  
索引为0的第一个单元格包含第一个字符。随后的每个字符都包含在索引递增的单元格中

put
这样的库函数希望您传递第一个字符的地址,然后它们读取字符串直到
\0

因此,如果只传递
string1
&string1[0]
,它将解析为
'H'
的地址

如果您传递
&string[1]
,它将解析为
'e'
的地址,库函数将认为这是第一个字符,因为这是C字符串设计时使用的契约。

对于字符串“Hello!”,内存表示形式如下

+-------+-------+-------+-------+-------+-------+-------+
|  'H'  |  'e'  |  'l'  |  'l'  |  'o'  |  '!'  | '\0'  |
+-------+-------+-------+-------+-------+-------+-------+  
索引为0的第一个单元格包含第一个字符。随后的每个字符都包含在索引递增的单元格中

put
这样的库函数希望您传递第一个字符的地址,然后它们读取字符串直到
\0

因此,如果只传递
string1
&string1[0]
,它将解析为
'H'
的地址


如果您传递
&字符串[1]
,它将解析为
'e'
的地址,库函数将认为这是第一个字符,因为这是C字符串设计的契约。

您的问题不是
string1
布局本身,而是
如何放置
解释它。字符串由
char
数组在C中表示,而t继承端标记为空终止符(代码为0的字符):

&string1[5]
是指向一个字符的指针,但由于以下字符不是空终止符,因此以下内存将被解释为字符串,并打印
nce

您需要使用
putc
并访问单个字符:

putc(string1[i])

您的问题不在于
string1
布局本身,而在于
put
如何解释它。字符串由C中的
char
数组表示,而其结尾标记为空终止符(带有代码0的字符):

&string1[5]
是指向一个字符的指针,但由于以下字符不是空终止符,因此以下内存将被解释为字符串,并打印
nce

您需要使用
putc
并访问单个字符:

putc(string1[i])

不,您只有一个长度为100的字符串。因此您的
puts
将发出一种移位版本的句子,如果您的句子短于15个字符,则会发出垃圾。一个字符串是几个字符,
string1[0]
是单个字符。如何将其完整地存储在其中?是的,您误解了。C实际上没有字符串,它有以空字节终止的字符数组。Yu可以使用[]语法将字符作为小整数进行操作,字符串[0]是第一个字母,字符串[1]是第二个字母,字符串[N]是nul。@如果我去掉for循环并使用puts(&string1[0]),则为StoryTeller;它将输出原始句子,而不仅仅是输出第一个字符,这会让我感到困惑。不,您只有一个长度为100的字符串。因此,您的
puts
将发出一种移位版本的句子,如果您的句子短于15个字符,则会发出垃圾。一个字符串是几个字符,
string1[0]
是单个字符。如何将其完整地存储在其中?是的,您误解了。C实际上没有字符串,它有以空字节终止的字符数组。Yu可以使用[]语法将字符作为小整数进行操作,字符串[0]是第一个字母,字符串[1]是第二个字母,字符串[N]是nul。@如果我去掉for循环并使用puts(&string1[0]),则为StoryTeller;它将输出原来的句子,而不是仅仅输出第一个字符,这让我感到困惑。谢谢你。我误解了其他答案,因为根据他们的推理,我误读了,好像每个循环只输出了一个字母。但是,显示了&string1[5]示例有助于巩固我使用puts时发生的情况。谢谢。我误解了其他答案,因为我误读了,好像每个循环只应输出一个字母