我执行这个程序,它接收来自字符串和子字符串的输入,然后通过确定它出现的频率(出现次数)和它所在的位置来搜索字符串中的子字符串,然后插入这些位置例如,进入一个数组(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
答案 0 :(得分:0)
您的代码完全无法读取。即使重新格式化和间隔,评论也很难看到重要的东西。
你应该只评论非显而易见的事项:int main(void) {// main statement
是一个无用的反效果评论的好例子。
删除所有评论后,代码会显示一些问题:
printf("Enter substring to search: \ n");
数组pos
的大小定义为0
:int 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}}