【问题标题】:Program works when I print the value out, but not when I don't程序在我打印出值时有效,但在我不打印时无效
【发布时间】:2021-01-20 01:27:14
【问题描述】:

我有以下程序正在检查子字符串。

#include <stdio.h>

#define TRUE 1
#define FALSE 0

int checkSubstring(char string[], char sub[]) {
    int k, j = 0;
    int count = 0;

    for(int i = 0; i<=8; i++) {
         if(sub[k] == string[i]) {
            j = j + 1;
            k = k + 1;
            count = count + 1;
        }
        else {
            j = i;
        }
    }

    printf("%d", count);

    if(count == 3) {
        return TRUE;
    }
    else {
        return FALSE;
    }
}

我正在测试我的程序,它似乎只有在我执行printf("%d", count); 时才有效。

例如,如果我针对“bus”测试字符串“Schoolbus”,它应该返回 TRUE,因为 bus 是 Schoolbus 中的子字符串。但是,它仅在 printf 语句到位时才返回 true。当我注释掉它时,它返回 FALSE。我不知道为什么会这样做……我在循环中使用 8 来测试校车的长度(9)。我还在检查 count 是否 == 3,因为如果字符串匹配,我可以将其计数到子字符串的长度。如果计数与长度不匹配,那么我们就知道它不匹配。

【问题讨论】:

  • k 未初始化,因此sub[k] 调用未定义的行为
  • 等等,我以为我可以做 int k,j = 0;?我发誓我在某个地方看到过
  • 你可以“做”它..它将j初始化为0,但k是未初始化的,因此它将采用内存中该位置的任何值,这是完全不可预测的。如果你希望它从 0 开始,你也需要说 k = 0。最好确保 stringsub 至少有 10 个字符长。

标签: c printf


【解决方案1】:

正如@yano 所指出的,k 未初始化,因此sub[k] 具有未定义的行为。

要将jk 都初始化为零,您可以这样做

int j = 0, k = 0;

int j, k;
j = k = 0;

不是

int k, j = 0;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2015-06-30
    • 2013-11-21
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多