C 为什么我只看到第一个角色
问题: 我知道我应该使用一个字符数组,但是字符数据作为它们对应的数值存储在数组中;所以我们可以说,int数组和字符数组都是相同的,唯一的区别是;通常,字符使用1个字节,int使用4个字节 我的问题: 我有一个int数组;我正在将数据存储到该数组中,但当我尝试使用printf和%s打印该数组时,它只是从该数组打印第一个字符 当%s与printf一起使用时,它会搜索空字符,即\0,以知道在哪里停止。在我的代码中,我将/0显式地放在字符串的末尾 代码(已编辑):C 为什么我只看到第一个角色,c,C,问题: 我知道我应该使用一个字符数组,但是字符数据作为它们对应的数值存储在数组中;所以我们可以说,int数组和字符数组都是相同的,唯一的区别是;通常,字符使用1个字节,int使用4个字节 我的问题: 我有一个int数组;我正在将数据存储到该数组中,但当我尝试使用printf和%s打印该数组时,它只是从该数组打印第一个字符 当%s与printf一起使用时,它会搜索空字符,即\0,以知道在哪里停止。在我的代码中,我将/0显式地放在字符串的末尾 代码(已编辑): /* Write a program
/* Write a program to print all input lines that are longer than 80
characters. */
#include <stdio.h>
#define MAXCHAR 80
#define LINES 1000
int main() {
int i, c = 0;
int data[LINES];
while(c != EOF) {
for(i = 0; i < LINES - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
data[i] = c;
printf("Value of i after for = %d\n",i );
if(c == '\n') {
data[i] = c;
++i;
}
data[i] = '\0';
if(i >= MAXCHAR + 2)
printf("%s\n",data);
printf("Value of i = %d\n",i );
}
}
/*编写一个程序来打印所有长度超过80的输入行
人物*/
#包括
#定义MAXCHAR 80
#定义第1000行
int main(){
int i,c=0;
int数据[行];
而(c!=EOF){
对于(i=0;i=MAXCHAR+2)
printf(“%s\n”,数据);
printf(“i的值=%d\n”,i);
}
}
如果您有一个包含字符串“Hello\0”的char
数组,它将如下所示:
+---+---+---+---+---+---+
| H | e | l | l | o |\0 |
+---+---+---+---+---+---+
+-----+-----+-----+-----+-----+-----+
| 72 | 101 | 108 | 108 | 111 | 0 |
+-----+-----+-----+-----+-----+-----+
+-----------+-----------+-----------+-----------+-----------+-----------+
| 72 | 101 | 108 | 108 | 111 | 0 |
+-----------+-----------+-----------+-----------+-----------+-----------+
+------+------+------+------+------+------+
| 0048 | 0065 | 006C | 006C | 006F | 0000 |
+------+------+------+------+------+------+
+----+----+----+----+----+----+----+----+----+----+----+----+
| 48 | 00 | 65 | 00 | 6C | 00 | 6C | 00 | 6F | 00 | 00 | 00 |
+----+----+----+----+----+----+----+----+----+----+----+----+
或者,如果我们显示这些字符的整数值,则如下所示:
+---+---+---+---+---+---+
| H | e | l | l | o |\0 |
+---+---+---+---+---+---+
+-----+-----+-----+-----+-----+-----+
| 72 | 101 | 108 | 108 | 111 | 0 |
+-----+-----+-----+-----+-----+-----+
+-----------+-----------+-----------+-----------+-----------+-----------+
| 72 | 101 | 108 | 108 | 111 | 0 |
+-----------+-----------+-----------+-----------+-----------+-----------+
+------+------+------+------+------+------+
| 0048 | 0065 | 006C | 006C | 006F | 0000 |
+------+------+------+------+------+------+
+----+----+----+----+----+----+----+----+----+----+----+----+
| 48 | 00 | 65 | 00 | 6C | 00 | 6C | 00 | 6F | 00 | 00 | 00 |
+----+----+----+----+----+----+----+----+----+----+----+----+
因此,如果我们有一个包含相同值的int
数组,它看起来如下所示:
+---+---+---+---+---+---+
| H | e | l | l | o |\0 |
+---+---+---+---+---+---+
+-----+-----+-----+-----+-----+-----+
| 72 | 101 | 108 | 108 | 111 | 0 |
+-----+-----+-----+-----+-----+-----+
+-----------+-----------+-----------+-----------+-----------+-----------+
| 72 | 101 | 108 | 108 | 111 | 0 |
+-----------+-----------+-----------+-----------+-----------+-----------+
+------+------+------+------+------+------+
| 0048 | 0065 | 006C | 006C | 006F | 0000 |
+------+------+------+------+------+------+
+----+----+----+----+----+----+----+----+----+----+----+----+
| 48 | 00 | 65 | 00 | 6C | 00 | 6C | 00 | 6F | 00 | 00 | 00 |
+----+----+----+----+----+----+----+----+----+----+----+----+
或者十六进制,假设16位整数,它如下所示:
+---+---+---+---+---+---+
| H | e | l | l | o |\0 |
+---+---+---+---+---+---+
+-----+-----+-----+-----+-----+-----+
| 72 | 101 | 108 | 108 | 111 | 0 |
+-----+-----+-----+-----+-----+-----+
+-----------+-----------+-----------+-----------+-----------+-----------+
| 72 | 101 | 108 | 108 | 111 | 0 |
+-----------+-----------+-----------+-----------+-----------+-----------+
+------+------+------+------+------+------+
| 0048 | 0065 | 006C | 006C | 006F | 0000 |
+------+------+------+------+------+------+
+----+----+----+----+----+----+----+----+----+----+----+----+
| 48 | 00 | 65 | 00 | 6C | 00 | 6C | 00 | 6F | 00 | 00 | 00 |
+----+----+----+----+----+----+----+----+----+----+----+----+
或者查看单个字节,并假设小端字节顺序,它如下所示:
+---+---+---+---+---+---+
| H | e | l | l | o |\0 |
+---+---+---+---+---+---+
+-----+-----+-----+-----+-----+-----+
| 72 | 101 | 108 | 108 | 111 | 0 |
+-----+-----+-----+-----+-----+-----+
+-----------+-----------+-----------+-----------+-----------+-----------+
| 72 | 101 | 108 | 108 | 111 | 0 |
+-----------+-----------+-----------+-----------+-----------+-----------+
+------+------+------+------+------+------+
| 0048 | 0065 | 006C | 006C | 006F | 0000 |
+------+------+------+------+------+------+
+----+----+----+----+----+----+----+----+----+----+----+----+
| 48 | 00 | 65 | 00 | 6C | 00 | 6C | 00 | 6F | 00 | 00 | 00 |
+----+----+----+----+----+----+----+----+----+----+----+----+
因此,如果我们有一个
int
数组,其中包含与字符串中的字符相对应的整数,并且如果(尽管存在严重的类型不兼容)我们尝试使用printf
和%s
打印它们,它将查看第一个字节,即48
,即H
,并打印它,但紧接着它将看到一个0字节,它将解释为字符串的结尾,然后停止。对不起,我对此表示歉意,我编辑的问题代码使用了错误的格式说明符,因此UB。Zzzzz。下一个无论如何,想想看:int
可能包含一个零字节作为其对象表示的一部分。printf(“%s\n”,data)
其中%s
表示“这是一个字符串,诚实”,而数据
不是字符串。无论如何,这个问题缺乏背景。你到底想做什么?对于什么输入,您实际需要什么输出?@Bhaskar然后使用int
的格式说明符。他是对的,您使用了错误的说明符。或者,格式说明符是正确的,而数组的类型是错误的。因此,这两种说明符应该打印相同的内容thing@Bhaskar重读整个答案。您可能只看到了第一部分,我正在编辑。“因此,如果我们有一个int
数组,其中包含与字符串中的字符相对应的整数,并且我们尝试使用printf
和%s
打印该字符串,那么它不是一个字符串,printf
调用未定义的行为。真正的答案可能是另一个问题,即询问OP试图做什么,以及这怎么可能不是这样做的。@下划线\u如果你是对的,我不应该将int*
称为“字符串”。固定的