我在随机字符串()中有一个for循环,它将一个随机字符放入字符串的前x个索引中,其中x<是字符串长度.然后,我在字符串中添加一个‘\0’,并使用printf()打印它,但它打印的字符比x多1个字符,并且该字符总是相同的,我不知道为什么.

这是我拥有的代码:

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

#define NELEMS(x) sizeof(x)/sizeof(x[0])
#define MAX_LENGTH 25

void randomChar();
void randomString();

int main()
{
    srand(time(NULL));
    int points = 0;

    randomString(&points, 3);

    return EXIT_SUCCESS;
}

void randomString(int *points, int length)
{    
    char input[MAX_LENGTH], output[MAX_LENGTH];
    do
    {
        int i;
        for (i = 0; i < length && i < NELEMS(output)-1; i++)
            output[i] = (char)(rand() % 26 + 97);
        output[i+1] = '\0';
        //output[i+2] = '\0';

        // for (int i = 0; i < NELEMS(output)-1; i++)
        //     output[i] = i < length ? (char)(rand() % 26 + 97) : '\0';

        
        printf("You have %d points, type %s:\n", *points, output);
        scanf("%s", &input);

        strcmp(input, output) == 0 ? *(points)++ : *(points)--;        
        getchar();
    } while (input[0] != '@');
}

我一直在try 这个长度为3的函数,得到一个结果:

You have 0 points, type opc♦:
a
You have 0 points, type lbu♦:
a
You have 14488832 points, type wal♦:
 

使用output[i+1] = '\0'output[i+2] = '\0'解决不了任何问题 注释掉的for循环可以工作,但我不知道为什么第一个循环不能工作

你知道为什么它多印了一个字符吗?

哦,如果你知道为什么14488832出现在输出中,我也想知道.

编辑:

DBush用(*Points)++而不是*(Points)++修复了指针错误,但在3个字母字符串之后打印另一个字符的第一个错误仍然存在:

You have 0 points, type opc♦:
a
You have 0 points, type lbu♦:

推荐答案

当您构建字符串时:

    for (i = 0; i < length && i < NELEMS(output)-1; i++)
        output[i] = (char)(rand() % 26 + 97);
    output[i+1] = '\0';

for循环执行递增步骤first,然后判断条件.这意味着当循环退出时,i又递增了一次,因此使用i+1作为终止字符的循环索引将跳过1.您需要改用i:

    output[i] = '\0';

至于输出中的奇怪数字,以下是您的问题:

strcmp(input, output) == 0 ? *(points)++ : *(points)--; 

您正在递增/递减指针points,而不是它所指向的指针.结果,你踩到了你不该踩到的记忆,这会触发undefined behavior.

要递增/递减points所指向的内容,请先将括号移至取消引用.

strcmp(input, output) == 0 ? (*points)++ : (*points)--; 

C++相关问答推荐

为指针 struct 创建宏

海湾合作委员会是否保证大小匹配的访问?

Bison解析器转移/减少冲突

修改pGM使用指针填充2-D数组但不起作用

segfault在C中使用getline()函数

为什么在C中二维字符数组会有这样的行为?

在 struct 中强制转换空指针

将宏值传递给ARM链接器,该链接器将变量放置在特定位置

不使用任何预定义的C函数进行逐位运算

如何对现有的双向循环链表进行排序?

将非连续物理内存映射到用户空间

如何逐位读取二进制文件?

为什么我无法访问C语言中的文件

如何在C宏定义中包含双引号?

某些EAX值的不同调用方的CPUID结果不一致

如何在不更改格式说明符的情况下同时支持双精度和长双精度?

通过GTK';传递回调参数;s g_signal_connect()导致C中出现意外值

free后内存泄漏?

C 中 struct 体自赋值是否安全?特别是如果一侧是指向 struct 的指针?

C 中类型说明符的顺序重要吗?