我正在创建一个简单的程序来查看字符串如何填充数组。
#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;
}
我在理解字符串填充数组时遇到了一些问题。我的期望是字符串将完全存储在string1 [0]中,并且任何其他索引将显示为空白。但是,当我抛出循环以查看我的假设是否为真时,事实证明每个索引都已被字符串填充。我误解了字符串是如何填充数组的吗?
答案 0 :(得分:2)
对于字符串“Hello!”,内存表示将类似于此
+-------+-------+-------+-------+-------+-------+-------+
| 'H' | 'e' | 'l' | 'l' | 'o' | '!' | '\0' |
+-------+-------+-------+-------+-------+-------+-------+
索引为0的第一个单元格包含第一个字符。并且每个后续字符都包含在索引增加的单元格中。
像puts
这样的库函数希望您传递第一个字符的地址,然后他们将字符串读取到\0
。
因此,如果您只是通过string1
或&string1[0]
,则会解析为'H'
的地址。
如果您通过&string[1]
,它将解析为'e'
的地址,并且库函数会认为 是第一个字符,因为这是合同C字符串用。来设计。
答案 1 :(得分:1)
字符串未存储在string1 [0] 中,但字符串的第一个字符存储在string1[0]
或字符串从{{1}开始}。这里,(string1+0)
可以看作指针,指向C String &string1[0] or (string1+0)
的指针。
从这个意义上讲,string1
的每个有效索引i
都会为您提供一个有效的指针string1
,它将指向C String (string1 + i)
的某些部分。
在最后一个for循环中,您将打印由string1
指向的字符串string1
的后缀...
答案 2 :(得分:1)
您的问题本身不是string1
布局,而是puts
如何解释它。字符串由C中的char
数组表示,而它们的结尾标记为空终止符(代码为0的字符):
S e n t e n c e \0
^ ^
string1 &string1[5]
&string1[5]
是指向一个字符的指针,但由于后面的字符不是空终止符,因此后续内存被解释为字符串并且nce
被打印。
您需要使用putc
并访问单个字符:
putc(string1[i])