声明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)
虽然这是不便携的,比我希望的要长一点.
如何最好地实现这一目标?
我一直在研究一个需要验证字符串中字符的项目.
例如,我的有效字符集是'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语句中输入整个条件之外,还有更简单的方法吗?任何帮助,将不胜感激.
所以我试图使用这个函数读取整个文本文件:
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行了。它带回文件并在最后添加一些垃圾。任何想法我做错了什么?
我最近正在阅读Kernighan的C编程语言.
有一个例子将变量定义为int类型但getchar()用于存储在其中.
int x;
x = getchar();
Run Code Online (Sandbox Code Playgroud)
为什么我们可以将char数据存储为int变量?我唯一能想到的就是ASCII和UNICODE.我对吗?
所以,我有一个奇怪的案例,并不能完全弄清楚我做错了什么.这是场景:
我写了一个创建器函数,它应该返回一个指向函数的指针.为了用数据填充结构,我读了一个文本文件.根据我用作输入的文本文件,错误会发生或不会发生.(对于具有~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) 我正在尝试在定义的位置添加一个角色.我已经创建了一个新函数,为一个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) 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) 我一直在尝试制作一个用户名和密码界面,我想知道是否可以在其中包含 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) 上述警告是从这一行发出的:
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) 我有这样的情况:
啊和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.h和B.hinA.h我得到:
error: unknown type name 'TypeB_t'在A.h
和
error: unknown type name 'TypeA_t'在B.h
我在这里发现了一个类似的问题,但它不适用于我的情况。