小编chq*_*lie的帖子

指示在c中评估操作数的顺序

声明puts("a") + puts("b")未定义.这是因为C标准中没有规定这些是否应该从左到右或从右到左执行,这样你才能得到

a
b
Run Code Online (Sandbox Code Playgroud)

要么

b
a
Run Code Online (Sandbox Code Playgroud)

是否有一种干净的方式来决定表达式中的操作顺序?

我唯一能想到的是使用复合语句,如

({
    int temp = puts("a");
    temp += puts("b");
    temp;
})
Run Code Online (Sandbox Code Playgroud)

虽然这是不便携的,比我希望的要长一点.

如何最好地实现这一目标?

c operator-precedence

3
推荐指数
1
解决办法
88
查看次数

字符串中的字符与C中的一组字符的比较

我一直在研究一个需要验证字符串中字符的项目.

例如,我的有效字符集是'abcde',其中所有字符都启动不同的功能.

首先,代码要求用户输入.之后,将其与此集进行比较以检查是否存在任何无效输入(除了以外的任何字母abcde).在此之后,角色启动它们各自的功能.

我知道可以使用以下方法执行此操作:

    for (i = 0; i <= sizeof(string) - 1; i++) {
        if (string[i] != 'a' || string[i] != 'b' || string[i] != 'c' || 
            string[i] != 'd' || string[i] != 'e') {
            printf("Invalid Input");
        }
    }
Run Code Online (Sandbox Code Playgroud)

用户可以从该组中输入任意组合的三个或四个字母.

除了在if语句中输入整个条件之外,还有更简单的方法吗?任何帮助,将不胜感激.

c string

3
推荐指数
1
解决办法
93
查看次数

C - 读取整个文件最后带有垃圾

所以我试图使用这个函数读取整个文本文件:

FILE *fp = fopen(path, "r");
fseek(fp, 0, SEEK_END);
int tamanioArchivo = sizeof(char) * ftell(fp);
fseek(fp, 0, SEEK_SET);
char* archivo = malloc(tamanioArchivo + 1);
fread(archivo, tamanioArchivo + 1, 1, fp);
//do something with archivo
fclose(fp);
free(archivo);
Run Code Online (Sandbox Code Playgroud)

我调试了它,问题似乎就fread行了。它带回文件并在最后添加一些垃圾。任何想法我做错了什么?

c file

3
推荐指数
1
解决办法
2615
查看次数

C语言:为什么int变量可以存储char?

我最近正在阅读Kernighan的C编程语言.

有一个例子将变量定义为int类型但getchar()用于存储在其中.

int x;
x = getchar();
Run Code Online (Sandbox Code Playgroud)

为什么我们可以将char数据存储为int变量?我唯一能想到的就是ASCII和UNICODE.我对吗?

c

3
推荐指数
1
解决办法
1202
查看次数

返回语句不会在c中执行

所以,我有一个奇怪的案例,并不能完全弄清楚我做错了什么.这是场景:

我写了一个创建器函数,它应该返回一个指向函数的指针.为了用数据填充结构,我读了一个文本文件.根据我用作输入的文本文件,错误会发生或不会发生.(对于具有~4000行的文本文件而言,错误发生,对于具有~200的文件,如果这会产生差异,则会发生错误).奇怪的是代码执行到return语句之前.但它不会返回但只是挂起.没有错误,没有编译器警告(英特尔编译器).我想知道是否有人经历过类似的事情或有什么可能出错的想法.

下面的代码被简化以说明问题.实际的代码有点复杂,因为我使用Schreiner的方法来玩C中的对象.

struct Somestruct {
    int A;
    int B;
    int C;
}

static void *Somestruct_ctor(void *_self) {
    struct Somestruct *self = _self;
    fillDataFromFile(self);
    printf("This line gets executed.\n");
    return self; // <- this one doesn't
}

int main(int argc, char *argv[]) {
    void *myObject;

    myObject = Somestruct_ctor(myObject);
    printf("The code does NOT get until here\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c return intel icc

3
推荐指数
1
解决办法
79
查看次数

如何在定义的位置附加char

我正在尝试在定义的位置添加一个角色.我已经创建了一个新函数,为一个char分配一个内存,在该位置之后保存字符,然后在定义的位置添加我的字符​​,现在我不知道如何在该位置之后擦除字符以连接保存的字符串.有解决方案吗

这是我的功能的开始:

void appendCharact(char *source, char carac, int position) {
    source = realloc(source, strlen(source) * sizeof(char) + 1); //Get enough memory
    char *temp = source.substr(position); //Save characters after my position
    source[position] = carac; //Add the character
}
Run Code Online (Sandbox Code Playgroud)

编辑:我正在尝试实现另一个"野蛮"的解决方案,在调试模式下,我可以看到我差不多是我的新字符串,但看起来我无法删除旧指针...

void appendCharact(char *source, char carac, int position) {
    char *temp = (char *)malloc((strlen(source) + 2) * sizeof(char));
    int i;
    for(i = 0; i < position; i++) {
        temp[i] = source[i];
    }

    temp[position] = carac;
    for (i = position; i < strlen(source); i++) …
Run Code Online (Sandbox Code Playgroud)

c string

3
推荐指数
1
解决办法
117
查看次数

添加到链表的头部

Student *addToHead(Student *node, int data) {
    Student *temp;
    temp = createNode(data);
    temp->nextPtr = node;
    return temp;
}
Run Code Online (Sandbox Code Playgroud)

这段代码没有插入链表的头部,我不知道为什么。我没有在链表的开头使用虚拟节点。

这是我的整个主要功能:

int main(void) {
    Student *test = initList();
    int searchTest = 0;

    test = addToHead(test, 3);
    test = addToHead(test, 2);
    test = addToHead(test, 1);
    test = addToTail(test, 4);
    test = addToTail(test, 5);

    printList(test);

    searchTest = searchAge(test, 4);
    printf("%d\n", searchTest);

    test = freeList(test);
}
Run Code Online (Sandbox Code Playgroud)

这是正在输出的内容:

4
5
0
Free was successful
Run Code Online (Sandbox Code Playgroud)

尾巴被正确插入,但不是头部。

这是尾巴的代码

Student *addToTail(Student *node, int data) {
    Student *temp;
    temp = …
Run Code Online (Sandbox Code Playgroud)

c struct linked-list singly-linked-list

3
推荐指数
1
解决办法
151
查看次数

在带有数组的语句中使用 OR,(C)

我一直在尝试制作一个用户名和密码界面,我想知道是否可以在其中包含 or 语句,strcmp以及是否也可以在 1 个字符串中使用数组的所有值,谢谢!

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

int main(int argc, char *argv[]) {
    int u, p;
    char Iuser[50],Ipass[50];
    char user[3][50] = { "user1", "user2", "user3" };
    char pass[3][50] = { "pass1", "pass2", "pass3" };
    
    printf("\n Enter your username:");
    gets(Iuser);
    u = strcmp(user[0|1|2], Iuser);
    if (u == 0) {
        printf("\n Enter your password");
        scanf("%s", &Ipass);
    } else {
        printf("\n Invalid Username, Try Again !");
    }
} 
Run Code Online (Sandbox Code Playgroud)

c arrays conditional-statements

3
推荐指数
1
解决办法
96
查看次数

警告:从“long long unsigned int”到“long int”的转换中发生溢出,将值从 ........ 更改为 .?

上述警告是从这一行发出的:

fseek(fp, -sizeof(usr), SEEK_CUR);
Run Code Online (Sandbox Code Playgroud)

fp是我的文件指针,usr也是我的结构。我正在执行上述操作以从文件更新结构。我尝试了各种方法,但无法删除警告:
更精确的警告:

warning: overflow in conversion from 'long long unsigned int' to 'long int' changes value from '18446744073709551304' to '-312' [-Woverflow] 
    fseek(fp, -sizeof(usr), SEEK_CUR);

Run Code Online (Sandbox Code Playgroud)

c

3
推荐指数
1
解决办法
1391
查看次数

C 中的头文件递归

我有这样的情况:

Bh

typedef struct TypeA TypeA_t;
struct TypeA {
    ...
    TypeA_t *a;
    void (*doSomething)(TypeB_t *);
};
Run Code Online (Sandbox Code Playgroud)

博赫

typedef struct TypeB TypeB_t;
struct TypeB {
    ...
    TypeB_t *b;
    TypeA_t something;
};
Run Code Online (Sandbox Code Playgroud)

在每个文件中包含头文件的正确方法是什么?

如果我包含A.hinB.hB.hinA.h我得到:

error: unknown type name 'TypeB_t'A.h

error: unknown type name 'TypeA_t'B.h

我在这里发现了一个类似的问题,但它不适用于我的情况。

c struct header

3
推荐指数
1
解决办法
79
查看次数