C语言 为什么它在第二个循环中不像在第一个循环中那样打印数组?

icomxhvb  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(85)

下面的程序在第一个循环中正确地打印了数组hello。但是在第二个循环中,它只打印了o。当然整数k是没有意义的,但是我使用它是因为我认为原因可能是我在第一个for循环中使用了i
我期待得到hello x2,但我采取了helloo。我仍然不明白为什么会发生这种情况,老实说,我试图弄清楚这一点超过一个小时,我卡住了

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

int main() {
    int i = 0;
    int j = 0;
    int plus = 0;
    char s[20] = "hello";
    strlen(s);
    int a = strlen(s);
    int count[strlen(s) - 1];
    int k = 0;

    for (i = 0; i < a; i++) {
        printf("%c", s[i]);
        if (s[i] == ' ')
            continue;
        else {
            for (j = 0; j < a; j++) {
                if (s[i] == s[j]) {
                    plus++;
                    count[i] = plus;
                }
            }
        }
        plus = 0;
    }
    printf("\n");

    // find max/es counts
    for (k = 0; k < a; k++) {
        printf("%c", s[k]);
    }

    return 0;
}

字符串
这个程序的目的并不重要,我只是想帮助理解为什么printf会给出这样的输出。

esyap4oy

esyap4oy1#

这个程序在你分配count[i]=plus;i==a时调用未定义的行为。
您需要从定义中删除-1。#
一些补充说明:
1.使用正确的尺寸类型-即size_t而不是int
1.使用有意义的变量名,而不是aijk.
1.您的strlen(s);行没有使用返回值是没有意义的

size_t plus=0;
    char text[20]="hello";
    size_t textLength=strlen(text);
    size_t count[textLength];

字符串

khbbv19g

khbbv19g2#

我用GDB调试了你代码,发现了一些有趣的信息。

(gdb) p s
$2 = "hello", '\000' <repeats 14 times>

(gdb) p /x (unsigned int)s
$5 = 0xffffd340

(gdb) p /x (unsigned int)count
$6 = 0xffffd330
(gdb) p /x count[4]
$7 = 0x6c6c6568

字符串
s的存储器地址是0xffffd340,而count的存储器地址是0xffffd330
0xffffd340 - 0xffffd330 = 0x10的值。“
count有多少个元素?
strlen(s) - 1,根据你的代码,int count[strlen(s) - 1]; .
s的值是“你好”,因此count具有5-1=4元素。
count的每个元素的大小为4字节,count占用4字节,4字节的内存地址为0xffffd330,0xffffd334,0xffffd338,0xffffd33c,0xffffd340
计数的最后一个元素的地址是0xffffd340。如果运行count[4] = 5,则0xffffd340-0xffffd341-0xffffd342-0xffffd343中的数据将是5-0-0-0
0xffffd340也是s.data的存储器地址,在0xffffd340-0xffffd341-0xffffd342-0xffffd343-0xffffd344中的数据是h-e-l-l-o
count[4] = 5覆盖0xffffd340-0xffffd341-0xffffd342-0xffffd343中的数据,并且s的值变为5-0-0-0-o
这是我行提供的日志。

(gdb) p s
$14 = "\005\000\000\000o", '\000' <repeats 14 times>


int count[strlen(s) - 1];修改为int count[strlen(s)];或注解count[i] = plus;将修复您的错误。

相关问题