我正在练习面试。 我目前坚持的问题是在C中反转一个常量字符串。我知道,因为str2是const,我可以修改str2指向的位置,但不能修改它的值。 我有一个名为reverse_const的函数。 它会将const char * str_const反转并打印出来。 但是,当我尝试从main方法反转后打印st2时,字符串不再反转。 它就像reverse_const()暂时改变了str2的内存位置。 我在这做错了什么? #include #include void reverse(char *str){ int c_size = strlen(str); char *c_begin = str, *c_end = str + (c_size – 1); int i; for(i = 0; i < c_size / 2; i++){ *c_begin ^= *c_end; *c_end ^= *c_begin; *c_begin ^= *c_end; c_begin++; c_end–; } } void […]
该程序应该创建一个动态内存向量。 我很确定我正确使用malloc。 我真正的问题是一些带指针的语法,特别是结构中的指针。 我正在尝试访问结构中的int指针的地址,所以我可以将它分配给另一个指针 我给出的结构是: typedef struct{ int *items; int capacity; int size; }VectorT; 而我正在努力工作的function是: int getVector(VectorT *v, int index){ int *p; p = v->items;//(2) p -= v->size; p += index; return *p; } 这应该取项目指针的地址减去列表中的项目数,并将所需项目的索引添加到p的地址。 然后我返回p的地址。 我有一种非常强烈的感觉,第(2)行不是我需要的语法。 根据我到目前为止的尝试,我的程序要么在调用getVector时崩溃,要么输出(我最好的猜测)一些内存位置。 这是添加向量的代码: void addVector(VectorT *v, int i){ if(v->size >= v->capacity){ //allocate twice as much as old vector and […]
我的编译器(clang)显示以下消息: 11:17:warning: format specifies type ‘char *’ but the argument has type ‘char (*)[0]’ [-Wformat] scanf(“%s”, &name); ~~ ^~~~~ 1 warning generated. 从以下代码(问候程序): /* * Program: gretting2.c * Utility: Display a greeting with your name. * Author: Adrián Garro. */ #include int main () { char name[0]; printf(“——————-\n”); printf(“Write your name: \n”); printf(“——————-\n”); scanf(“%s”, &name); […]
我有以下程序导致分段错误。 #include #include #include int main(int argc, char *argv[]) { printf(“TEST”); for (int k=0; k<(strlen(argv[1])); k++) { if (!isalpha(argv[1])) { printf("Enter only alphabets!"); return 1; } } return 0; } 我已经发现正是这条线导致了这个问题 if (!isalpha(argv[1])) { 用argv[1][k]替换argv[1] argv[1][k]解决了这个问题。 但是,我觉得很奇怪程序会导致分段错误,甚至没有打印TEST 。 我还期望isalpha函数错误地检查char*指针的低字节是否指向argv[1] ,但似乎并非如此。 我有代码来检查参数的数量,但为简洁起见,此处未显示。 这里发生了什么事?
这是一种定义Matrix类型的方法 typedef struct { int nr, nc; double *elem; } Matrix; 我想定义一下 typedef struct { int nr, nc; double elem[nr][nc]; } Matrix; 这会很好,因为我不必担心索引。 这就是VLA首先有用的原因,因为它们只能透明地完成索引算法的简单操作。 当然,如果只是因为结构的大小不能很好地定义,上述情况是不可能的。 然后,我仍然会满意: typedef struct { int nr, nc; double (*elem)[nc]; } Matrix; 现在,矩阵数据被存储为指针,就像在非VLA情况下一样。 但算法仍然可以由编译器完成。 该定义仅告诉它是某种指向double数据的指针,其中double精度数以nc为单位排列。 它似乎不允许标准,我想知道为什么,因为通过transtyping很容易做同样的事情。 例如,使用第一个定义(带有double * ),我可以做到 double get(Matrix *a, int i, int j) { int nc = a->nc; […]
扩展我之前的练习,我有一个文本文件,每行填充一个单词。 hello hi hello bonjour bonjour hello 当我从文件中读取这些单词时,我想将它们与一个struct指针数组(从文本文件创建)进行比较。 如果数组中不存在该单词,则应将该单词存储到计数为1的结构指针中。如果该单词已存在于数组中,则计数应增加1.我将结果写入新文件(那已经存在了)。 hello = 3 hi = 1 bonjour = 2 这是我的代码 #include #include struct wordfreq{ int count; char *word; }; int main(int argc, char * argv[]) { struct wordfreq *words[1000] = {NULL}; int i, j, f = 0; for(i=0; i <1000; i++) words[i] = (struct wordfreq*)malloc(sizeof(struct wordfreq)); […]
我正在排序一个字符串数组(不区分大小写)。 qsort导致分段错误,可能是我的演员不合适。 #include #include #include int compare(const void *string1, const void *string2) { char *a = (char*)(string1); char *b = (char*)(string2); printf(“comparing %s AND %s\n”, a, b); return strcasecmp(a,b); } void sortListName(char **fileList, int noOfFiles) { printf(“Sorting\n”); qsort(fileList, noOfFiles, 260*sizeof(char), compare); return; } ** fileList =字符串数组(文件名) PS main()显而易见,工作正常。
以下代码指向只读内存中可用的char数组中的第一个字符 。 是对的吗?: const char * ptr = “String one”; 现在当ptr开始指向另一个内存位置时: ptr = “String two”; 第一个char数组会发生什么? 执行结束时是否释放了该内存位置?
我不确定C / C ++三元运算符的执行保证。 例如,如果给出一个地址和一个布尔值来告诉该地址是否适合阅读,我可以使用if / else轻松避免错误读取: int foo(const bool addressGood, const int* ptr) { if (addressGood) { return ptr[0]; } else { return 0; } } 但是,三元运算符( ?: addressGood可以保证除非addressGood为真,否则不会访问ptr ? 或者优化编译器是否可以生成在任何情况下访问ptr代码(可能使程序崩溃),将值存储在中间寄存器中并使用条件赋值来实现三元运算符? int foo(const bool addressGood, const int* ptr) { // Not sure about ptr access conditions here. return (addressGood) ? ptr[0] : 0; } […]
char *buf = malloc(bufsize) char *ptr = buf; … while(condition) { ptrdiff_t offset = ptr – buf; // bufsize) { // we need more room bufsize += 128; buf = realloc(buf, bufsize); ptr = buf + offset; // buf might be in a completely new location } *ptr++ = … // write this byte } […]