小编chq*_*lie的帖子

如何实现Cormen and Co.的"算法导论"中的合并排序

我正在学习Cormen和Co.的算法,我从他们的伪代码实现合并排序有问题.我编译它:

$ gcc -Wall -g merge_sort.c
Run Code Online (Sandbox Code Playgroud)

我有一个问题因为数字:

2 4 5 7 1 2 3 6
Run Code Online (Sandbox Code Playgroud)

结果是:

1 2 2 3 3 4 5 5 
Run Code Online (Sandbox Code Playgroud)

我试着仔细阅读伪代码,但这对我没有帮助.我想知道我做错了什么.以下是我的代码:

#include <stdio.h>

#define SIZE 8

void merge(int *array_of_integers, int p, int q, int r) {
    int n1 = q - p + 1;
    int n2 = r - q; 
    int i, j, k;
    int left_array[n1 + 1];
    int right_array[n2 + 1];

    for (i = 0; i < n1; i++)
        left_array[i] = array_of_integers[p + i];
    for …
Run Code Online (Sandbox Code Playgroud)

c algorithm mergesort

11
推荐指数
2
解决办法
8062
查看次数

C - 警告:格式'%s'需要类型'char*',但参数2的类型为'char(*)[20]'

我正在尝试运行一个简单的C程序,但是我收到了这个错误:"警告:格式'%s'需要类型'char ',但参数2的类型为'char()[20]'"

使用gcc 4.2.1在终端中运行Mac OSX Mountain Lion编译

#include <stdio.h>

int main() {
    char me[20];

    printf("What is your name?");
    scanf("%s", &me);
    printf("Darn glad to meet you, %s!\n", me);

    return (0);
}
Run Code Online (Sandbox Code Playgroud)

c arrays pointers

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

优化的strcmp实现

这个功能在这里找到.这是一个实现strcmp:

int strcmp(const char* s1, const char* s2)
{
    while (*s1 && (*s1 == *s2))
        s1++, s2++;
    return *(const unsigned char*)s1 - *(const unsigned char*)s2;
}
Run Code Online (Sandbox Code Playgroud)

我理解除了最后一行之外的所有内容,简言之,最后一行是怎么回事?

c string-comparison strcmp

11
推荐指数
1
解决办法
2万
查看次数

为什么fopen参数限制在C标准和<stdio.h>头文件中限定?

标准库函数fopen声明<stdio.h>为:

FILE *fopen(const char * restrict filename, const char * restrict mode);
Run Code Online (Sandbox Code Playgroud)

这也是函数原型在C标准中的出现方式.

为什么论证restrict合格?

c libc language-lawyer

11
推荐指数
1
解决办法
243
查看次数

有没有办法让countof()测试它的参数是否是一个数组?

用于计算数组中元素数量的经典宏是:

#define countof(a)  (sizeof(a) / sizeof(*(a)))
Run Code Online (Sandbox Code Playgroud)

这个问题是如果参数是指针而不是数组,它会无声地失败.是否有一种可移植的方法来确保此宏仅与实际数组一起使用,如果a不是数组则生成编译时错误?

编辑:我的问题似乎是这个问题的重复:拒绝指针的数组大小的宏

c arrays

11
推荐指数
1
解决办法
263
查看次数

C中多线程矩阵乘法

我想创建一个 C 程序,它使用线程计算两个 N*N 矩阵的乘法。
我通过使用多个线程引用矩阵乘法开始此代码,但不是为结果矩阵的每个单元格创建 N * N 个线程,我想创建 N 个线程来同时执行乘法,其中结果矩阵的每一行将通过一个不同的线程。

到目前为止,我的代码如下所示:

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

#define N 2

struct v {
    int i;  //Row
    int j;  //Column
};

int A[N][N] = {{ 1, 2 }, { 3, 4 }};//Matrix 1
int B[N][N] = {{ 2, 3 }, { 4, 5 }};//Matrix 2
int C[N][N];  //Resulting Matrix

static void *fnc(void *arg) {
    struct v *data = (struct v *)arg;
    int l; …
Run Code Online (Sandbox Code Playgroud)

c

10
推荐指数
1
解决办法
1万
查看次数

为什么逐列复制2D数组比C中的逐行复制?

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

#define N  32768

char a[N][N];
char b[N][N];

int main() {
    int i, j;

    printf("address of a[%d][%d] = %p\n", N, N, &a[N][N]);
    printf("address of b[%5d][%5d] = %p\n", 0, 0, &b[0][0]);

    clock_t start = clock();
    for (j = 0; j < N; j++)
        for (i = 0; i < N; i++)
            a[i][j] = b[i][j];
    clock_t end = clock();
    float seconds = (float)(end - start) / CLOCKS_PER_SEC;
    printf("time taken: %f secs\n", seconds);

    start = clock();
    for (i = 0; …
Run Code Online (Sandbox Code Playgroud)

c arrays

10
推荐指数
2
解决办法
347
查看次数

迭代for循环中的所有无符号整数

假设我想在循环中迭代所有整数for.为了便于讨论,假设我f(unsigned x)为每个整数调用一些未知函数:

for (unsigned i = 0; i < UINT_MAX; i++) {
     f(i);
}
Run Code Online (Sandbox Code Playgroud)

当然,上面的代码无法遍历所有整数,因为它错过了一个:UINT_MAX.将条件更改为i <= UINT_MAX仅导致无限循环,因为这是一个重言式.

你可以用do-while循环来完成它,但是你会失去for语法的所有细节.

我可以吃蛋糕(for循环)并吃掉它(迭代所有整数)吗?

c syntax loops for-loop

10
推荐指数
2
解决办法
715
查看次数

访问带有char*的int可能具有未定义的行为吗?

下面用于测试字节顺序的代码应该具有实现定义的行为:

int is_little_endian(void) {
    int x = 1;
    char *p = (char*)&x;
    return *p == 1;
}
Run Code Online (Sandbox Code Playgroud)

但它有可能在故意设计的架构上有不确定的行为吗?例如,int带有值1(或另一个选择好的值)的表示的第一个字节是该char类型的陷阱值吗?

如注释中所述,类型unsigned char不会出现此问题,因为它不能具有陷阱值,但此问题特别涉及char类型.

c casting undefined-behavior language-lawyer

10
推荐指数
1
解决办法
168
查看次数

设置为 CHAR_MAX 的字符值是否保证环绕到 CHAR_MIN?

我的代码:

#include <stdio.h>
#include <limits.h>

int main()
{
    char c = CHAR_MAX;
    c += 1;
    printf("CHAR_MIN=%d CHAR_MAX=%d c=%d (%c)\n", CHAR_MIN, CHAR_MAX, c, c);
}
Run Code Online (Sandbox Code Playgroud)

输出:

CHAR_MIN=-128 CHAR_MAX=127 c=-128 ()
Run Code Online (Sandbox Code Playgroud)

我们看到,当我们增加一个char设置为的变量时CHAR_MAX,它会环绕到CHAR_MIN。这种行为有保证吗?或者它将是未定义的行为或实现指定的行为?C99 标准对此有何评论?

[注意:将大于 CHAR_MAX (127) 的值赋予 charC会发生什么-为什么 char c=129 会转换为 -127?没有解决这个问题,因为他们谈论分配一个超出范围的值而不是将一个值增加到一个超出范围的值。]

c standards integer-overflow char language-lawyer

10
推荐指数
1
解决办法
612
查看次数