小编chq*_*lie的帖子

使用 fgets() 读取多行。如何转到下一行?

所以我正在打开一个文件,其中包含我为我的任务设计的纸牌游戏的纸牌数据,基本上每行包含 104 个字符,每行等于一副纸牌。

我正在使用一个char ****因为

  1. 甲板数量
  2. 玩家人数 (4)
  3. 卡数 (13)
  4. card 表示为9H,3D表示九颗心和三颗菱形,因此它使用 2 个字符。

我想用来fgets()阅读多行,但我不确定这是否有效......

for循环只是甲板文件的设置方式,我只是想知道它是否fgets会在命中时转到下一行\n......

    di->cards = (char ****)malloc(sizeof(char***) * di->numDecks);
    for (i = 0; i < di->numDecks; i++) {
        di->cards[i] = (char ***)malloc(sizeof(char**) * 4);
        for (j = 0; j < 4, j++) {
            di->cards[i][j] = (char **)malloc(sizeof(char*) * 13);
            for (k = 0, k < 13, k++) {
                di->cards[i][j][k] = (char *)malloc(sizeof(char) * 3); …
Run Code Online (Sandbox Code Playgroud)

c

4
推荐指数
2
解决办法
5万
查看次数

计算c中设置的位数的程序

我试图计算 C 中整数值中设置的位数。但是对于某些值,它显示了正确的位集计数,而对于某些值则不是。

PFB程序代码

int main()
{
    int a = 512, i = 0, j = 1, count = 0, k = 0;

    for (i = 0; i < 31; i++)
    {
        if (k = a & j)
        {
            count++;
            j = j << 1;
        }
    }
    printf("the total bit set count is %d", count);
}
Run Code Online (Sandbox Code Playgroud)

512 的设置位值计数的输出显示为零,如果使用的值是 511,则计数显示为 9。

请帮我改正程序。

c

4
推荐指数
2
解决办法
5861
查看次数

Malloc,strlen,strcat

以下是我正在编写的程序开头的一段代码(包含错误).

    char *name;
    char *name2;

    if (argn != 2) {
        printf("You have to enter the name of the input file");
        return 1;
    }

    name = malloc(strlen(arg[1]) + 1);      
    name2 = malloc(strlen(arg[1]) + 1);

    strcpy(name, arg[1]); 
    strcpy(name2, arg[1]);

    strcat(name2, "-results.pdb");  
Run Code Online (Sandbox Code Playgroud)

这里有一个错误strcat,实际上name2没有足够的大小来执行上面的操作.然而strcat执行没有问题.但是后来在程序的一个完全不相关的部分中,在此之后初始化的另一个数组的操作strcat给出了错误.它是一个整数数组,我为其分配值,并在分配所有值之前给出错误.我假设因为上面的操作在name2中没有足够的内存,所以"某种程度上"会影响下一个初始化的数组.我想了解:

1-这里可能发生什么,以便无法写入name2的额外信息会影响稍后声明的其他数组?

2-我可能无法在更复杂的程序中轻易地回溯这个问题,因为错误发生在其他地方而不是strcat中.我怎样才能防止这种偷偷摸摸的错误,比如memory problematic影响其他地方完全不相关的数组?

c arrays memory-management

4
推荐指数
2
解决办法
682
查看次数

printf @ plt和puts @ plt之间的区别

我一直在通过反汇编一些C代码来学习汇编语言.当我用GDB反汇编这个基本的C代码时:

#include <stdio.h>
void main(void) {
    printf("Hello World\n");
}
Run Code Online (Sandbox Code Playgroud)

在汇编代码中,它给出了这一行:

0x08048424 <+25>:   call   0x80482e0 <puts@plt>
Run Code Online (Sandbox Code Playgroud)

但是,当我在printf函数中具有整数的代码下面进行反汇编时:

#include <stdio.h>
void main(void) {
    int a = 1;
    printf("Hello Word %d\n", a);
}
Run Code Online (Sandbox Code Playgroud)

它给出了这一行:

0x0804842e <+35>:   call   0x80482e0 <printf@plt>
Run Code Online (Sandbox Code Playgroud)

printf @ plt和puts @ plt有什么区别?

为什么反汇编程序在没有整数参数的情况下无法识别printf函数?

c disassembly

4
推荐指数
1
解决办法
1528
查看次数

strtoull(“-1”,NULL,0)和其他负值的惊人行为

strtoull("-1", NULL, 0)在我测试的系统(带有Apple Libc的OS / X,带有Glibc的Linux)上的计算结果为18446744073709551615,(0xFFFFFFFFFFFFFFFF又名ULLONG_MAX)。

由于strtoull应该检查返回值范围之外的值,为什么它不0为所有负值返回?

编辑:周围的行为-ULLONG_MAX似乎也不一致:

strtoul("-18446744073709551615", NULL, 0) -> 1, errno=0
strtoul("-18446744073709551616", NULL, 0) -> 18446744073709551615, errno=34
Run Code Online (Sandbox Code Playgroud)

c language-lawyer strtoull

4
推荐指数
1
解决办法
173
查看次数

从类型'int(*)[1000]分配给类型'int [100] [1000]'时的类型不兼容

我必须制作2个程序。一个在共享内存上写入矩阵,另一个必须读取并排序该矩阵。

我创建了一个共享结构,即要放入共享内存中的var。但是我不知道如何读取和存储在另一个变量上。

我的共享结构:

#define QUANTIDADE 100
#define TAMANHO 1000

struct shared_use_st {
    int written_by_you;
    int num_processos_executando;
    int arrays[QUANTIDADE][TAMANHO];
};
Run Code Online (Sandbox Code Playgroud)

如何在编写者代码上创建矩阵:

    int i, j;
    for (j = 0; j < QUANTIDADE; j++) {
        for (i = 0; i < TAMANHO; i++) {
            shared_stuff->arrays[j][i] = rand();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我要如何从内存中读取:

int my_arrays[QUANTIDADE][TAMANHO];

int main() {
    [...]
    my_arrays = shared_stuff->arrays; //Error
    [...]
}
Run Code Online (Sandbox Code Playgroud)

c

4
推荐指数
1
解决办法
52
查看次数

使用 while(str[n++]!='\0') 计算字符串的长度

请忽略那里的日本人。
我尝试使用以下代码计算从 stdin 输入的字符串的长度。但它没有按预期工作:

#include <stdio.h>

int main(int argc, const char *argv[]) {
    char str[100];

    printf("?????????????");  // Please enter a string:
    fgets(str,99,stdin);

    int n = 0;
    while (str[n++] != '\0');
    printf("???????%d??\n", n);  // The length of the string is %d\n
    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

例如,如果我输入glacious,我会得到n=10,我期望是n=8
我知道n++str[n++] != '\0'评估后会增加 n ,并且\0是附加到每个字符串的默认字符。但不知何故,这对我来说没有意义。我知道我可以通过n-=2在最后添加来达到我的目的,但我真的很想了解这里发生了什么。提前谢谢了!

c

4
推荐指数
1
解决办法
180
查看次数

使用二分查找查找已排序字符串中的第一个大写字母

我编写了以下代码来使用二进制搜索查找字符串中的第一个大写字母:

char first_capital(const char str[], int n)
{
    int begin = 0;
    int end = n - 1;
    int mid;
    while (begin <= end)
    {
        mid = (begin + end) / 2;
        if (mid == 0 && isupper(str[mid]))
        {
            return mid;
        }
        else if (mid > 0 && isupper(str[mid]) && islower(str[mid - 1]))
        {
            return mid;
        }
        if (islower(str[mid]))
        {
            begin = mid + 1;
        }
        else
        {
            end = mid - 1;
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

目前我的代码在测试时没有按预期工作。如果有人能提到我哪里出错了,那会很有帮助。

注意:输入字符串将已经排序(所有小写字母都出现在大写字母之前)。 …

c c-strings char uppercase function-definition

4
推荐指数
1
解决办法
160
查看次数

你如何在 C 预处理器中使用定义进行逻辑异或异或

确保仅定义两个名称之一的最简单方法是什么,例如:

#define USE_OPTION1
#define USE_OPTION2

#if not(USE_OPTION1 ^ USE_OPTION2)
#error "You must use at least one option, but not both"
#endif
Run Code Online (Sandbox Code Playgroud)

我知道 C 或 C++ 中没有逻辑异或,那么最好的方法是什么?不一定是这样,是吗:

#define USE_OPTION1
#define USE_OPTION2
        
#ifdef USE_OPTION1
  #ifdef USE_OPTION2
  #error "You can't use both"
  #endif
#endif

#ifdef USE_OPTION2
  #ifdef USE_OPTION1
  #error "You can't use both"
  #endif
#endif

#ifndef USE_OPTION1
  #ifndef USE_OPTION2
  #error "You must use at least one"
  #endif
#endif
Run Code Online (Sandbox Code Playgroud)

c c++ preprocessor

4
推荐指数
1
解决办法
71
查看次数

不确定为什么 toupper() 会切断 C 中的最后一个字母

所以这个程序的目标基本上是在终端(通过argv[])中获取一个 26 个字母的“键”,并使用它的索引作为替代指南。因此,您在终端中输入了 2 个输入,一个在 the 中argv[],一个只是普通get_string()输入。该argv[]输入将是这样的:./s YTNSHKVEFXRBAUQZCLWDMIPGJO这里s是文件名。然后get_string()输入如下所示:plaintext: HELLO。(输入是HELLO)。然后程序将循环遍历纯文本输入中的所有字母,并根据键的索引替换其字母索引argv[]。例如,H有一个按字母顺序排列的索引7(其中a= 0 和z= 25),因此我们查看键中的第 7 个索引YTNSHKV(E)FXRBAUQZCLWDMIPGJO,在本例中为E. 它对输入中的每个字母执行此操作,我们将得到输出ciphertext: EHBBQ。这是它在终端中的样子:

./s YTNSHKVEFXRBAUQZCLWDMIPGJO
plaintext:  HELLO
ciphertext: EHBBQ
Run Code Online (Sandbox Code Playgroud)

但是我的输出是EHBB,因为当我使用toupper().

而且,大小写取决于明文输入,如果明文输入是hello, worldargv[]键是YTNSHKVEFXRBAUQZCLWDMIPGJO,则输出是jrssb, ybwsp,如果输入HellO, world具有相同的键,则输出是JrssB, ybwsp

我基本上已经解决了这个问题,我的程序根据通过命令行输入的密钥将给出的明文替换为正确的密文。现在,假设明文输入是HELLO …

c arrays letter toupper

4
推荐指数
1
解决办法
91
查看次数