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时发生的情况。谢谢。我误解了其他答案,因为我误读了,好像每个循环只应输出一个字母