c中的数组反向输出

时间:2017-07-03 12:04:10

标签: c arrays loops reverse

我执行这个程序,它接收来自字符串和子字符串的输入,然后通过确定它出现的频率(出现次数)和它所在的位置来搜索字符串中的子字符串,然后插入这些位置例如,进入一个数组(4 5 8)并且它们被正确打印,现在正是我想要做的,一旦我在找到子串的位置内得到我的数组,它就会反向打印它({{1我试过使用这个循环

8 5 4

但如果数组位置为// reverse output printf ("%d", count); for (j = count - 1; j >= 0; j--)     printf("%d", pos[j]); ,那么它会打印给我

8 5 4

为什么会这样?这是代码:

5 ,4, -311228772

2 个答案:

答案 0 :(得分:0)

您的代码完全无法读取。即使重新格式化和间隔,评论也很难看到重要的东西。

你应该只评论非显而易见的事项:int main(void) {// main statement是一个无用的反效果评论的好例子。

删除所有评论后,代码会显示一些问题:

  • printf("Enter substring to search: \ n");

  • 中有一个额外的空格
  • 数组pos的大小定义为0int count = 0; int pos[count];。该程序有不确定的行为。

  • 在将偏移量存储到数组之前,
  • count会递增。因此,数组内容不会从索引0开始,因此当您在第二个循环中从count-1向下迭代到0时会产生错误的输出。

以下是简化版本:

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

/*
   Reads a string from the stream allocated with malloc
   stops at newline, not included in string.
   Returns NULL at EOF
 */
char *my_getline(FILE *stream) {
    char *line = NULL;
    size_t pos = 0;
    int c;

    while ((c = getc(stream)) != EOF) {
        char *newp = realloc(line, pos + 2);
        if (newp == NULL) {
            free(line);
            return NULL;
        }
        line = newp;
        if (c == '\n')
            break;
        line[pos++] = (char)c;
    }
    if (line) {
        line[pos] = '\0';
    }
    return line;
}

int main(void) {

    printf("Enter Main String:\n");
    char *str = my_getline(stdin);

    printf("Enter substring to search:\n");
    char *sub = my_getline(stdin);

    if (str && sub) {
        size_t count = 0;
        size_t len1 = strlen(str);
        size_t len2 = strlen(sub);
        size_t pos[len1 + 1];

        for (size_t i = 0; i + len2 <= len1; i++) {
            if (!memcmp(str + i, sub, len2)) {
                pos[count] = i + 1;
                printf("%d\n", (int)pos[count]);
                count++;
            }
        }
        if (count != 0) {
            printf("number of times: %d\n", (int)count);
            for (size_t j = count; j-- > 0;) {
                printf(" %d", (int)pos[j]);
            }
            printf("\n");
        } else {
            printf("substring not found.\n");
        }
    }
    free(str);
    free(sub);
    return 0;
}

答案 1 :(得分:-2)

您将pos声明为长度为0的数组:

for (j = count-1; j>= 0; j--)
  printf ("%d", pos [j]);

因此,在你的for循环中,你将访问一些单元化的内存:

{{1}}