小编Lun*_*din的帖子

这些奇怪的问号是什么意思?

我遇到了一些奇怪的代码.它甚至看起来都不像C,但令我惊讶的是它编译并在我的C编译器上运行.这是C语言的一些非标准扩展吗?如果是这样,它的原因是什么?

??=include <stdio.h>

int main()
??<
  const char arr[] = 
  ??<
    0xF0 ??! 0x0F,
    ??-0x00,
    0xAA ??' 0x55
  ??>;

  for(int i=0; i<sizeof(arr)/sizeof(*arr); i++)
  ??<
    printf("%X??/n", (unsigned char)arr??(i??));
  ??>

  return 0;
??>
Run Code Online (Sandbox Code Playgroud)

输出:

FF
FF
FF
Run Code Online (Sandbox Code Playgroud)

c trigraphs

5
推荐指数
1
解决办法
542
查看次数

SqlException(0x80131904):用户“db123”登录失败

当我将网站上传到服务器(即并行 plesk 服务器)时,出现此错误。我在 plesk 服务器上创建表并选择 SQL Server 2012。但我认为这是一个连接字符串错误。如果您知道此错误,请指导我。

“/”应用程序中的服务器错误。用户“db123”登录失败。描述:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。

异常详细信息:System.Data.SqlClient.SqlException:用户“db123”登录失败。

来源错误:

执行当前 Web 请求期间生成未处理的异常。有关异常来源和位置的信息可以使用下面的异常堆栈跟踪来识别。

sql-server asp.net

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

这个字符串比较逻辑的缺陷是什么?

下列

#include <iostream>

unsigned short int stringCompare ( char * s1, char * s2 )
{
// returns 1 if the character arrays s1 and s2 are equal; 
// returns 0 otherwise
    while (*s1 && (*s1++ == *s2++));
    return (!(*s1) && !(*s2));
}

int main () 
{
    char str1 [] = "americano";
    char str2 [] = "americana";
    std::cout << stringCompare(str1,str2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

打印1,意味着我的函数的逻辑是不正确的.我想明白为什么.让我解释一下我的逻辑:

while (*s1 && (*s1++ == *s2++))
Run Code Online (Sandbox Code Playgroud)

同时递增指针s1,s2只要s1不等于,'\0'并且s1 …

c++ string algorithm

5
推荐指数
1
解决办法
152
查看次数

两次访问相同的内存位置,UB与否?

这个帖子中,评分最高的答案获得了大量的票数甚至是赏金.它提出了以下算法:

void RemoveSpaces(char* source)
{
  char* i = source;
  char* j = source;
  while(*j != 0)
  {
    *i = *j++;         // UB?
    if(*i != ' ')
      i++;
  }
  *i = 0;
}
Run Code Online (Sandbox Code Playgroud)

我的膝盖反射是这个代码调用未定义的行为,因为ij指向相同的内存位置,然后一个表达式*i = *j++;然后访问相同的变量两次,用于其他目的,而不是确定要存储的内容,两者之间没有序列点.尽管它们是两个不同的变量,但它们最初指向相同的存储位置.

但是我不确定,因为我不太清楚同一个内存位置的两个非顺序访问如何在实践中造成任何伤害.

我是否正确地指出这是未定义的行为?如果是这样,是否有任何关于如何依赖这种UB可能导致有害行为的例子?


编辑

将此标记为UB的C标准的相关部分是:

C99 6.5

在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,先前的值应该只读以确定要存储的值.

C11 6.5

如果相对于对同一标量对象的不同副作用或使用相同标量对象的值进行值计算,对标量对象的副作用未被排序,则行为未定义.如果表达式的子表达式有多个允许的排序,则如果在任何排序中发生这种未测序的副作用,则行为是不确定的.

在两个版本的标准中,文本的实际含义应该相同,但我相信C99文本更容易阅读和理解.

c undefined-behavior language-lawyer

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

将变量复制到一个缓冲区中并读取它

我创建了三个缓冲区和变量,并将每个变量复制到相应的缓冲区。

然后我从缓冲区中取出指针并打印出来。

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

int main() {

    // Buffers.
    unsigned char a_buffer[sizeof(int)];
    unsigned char b_buffer[sizeof(int)];
    unsigned char c_buffer[sizeof(float)];

    // Variables ressources.
    int a = 65500;
    int b = 32000;
    float c = 3.14;

    // Variables pointers.
    int *aa = NULL;
    int *bb = NULL;
    float *cc = NULL;

    /* Copy variables to buffer. */
    memcpy(a_buffer, &a, sizeof(int));
    memcpy(b_buffer, &b, sizeof(int));
    memcpy(c_buffer, &c, sizeof(float));

    /* Set pointers. */
    aa = (int*) a_buffer;
    bb = (int*) b_buffer;
    cc = (float*) …
Run Code Online (Sandbox Code Playgroud)

c buffer store

5
推荐指数
1
解决办法
1868
查看次数

getop()函数K&R book p 78

我正在学习K&R书.目前我正在阅读函数getop(),第78页.我理解代码,但我需要澄清两件事.

getop()的代码如下:

int getch(void);
void ungetch(int);

/* getop: get next character or numeric operand */
int getop(char s[])
{
    int i, c;
    while ((s[0] = c = getch()) == ' ' || c == '\t')
        ;
    s[1] = '\0';

    if (!isdigit(c) && c != '.')
        return c; /* not a number */

    i = 0;
    if (isdigit(c)) /* collect integer part */
        while (isdigit(s[++i] = c = getch()))
            ;
    if (c == '.') /* collect fraction part */
        while (isdigit(s[++i] …
Run Code Online (Sandbox Code Playgroud)

c kernighan-and-ritchie

5
推荐指数
1
解决办法
1140
查看次数

表达式分配给更广泛的基本类型

我从分析工具中收到以下警告,Composite expression assigned to a wider essential type 这是代码:

uint32_t result;
uint8_t resolution;

result = 1U << resolution;
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

#define SHIFT_BY_ONE (uint8_t)1
result  = SHIFT_BY_ONE << resolution;
Run Code Online (Sandbox Code Playgroud)

但这会引发此警告,Shift left of signed quantity (int) 所以我想我无法正确理解该问题。如何解决此错误?

c lint misra

5
推荐指数
1
解决办法
2318
查看次数

CodeBlocks - 如何将图标添加到C程序?

我有一个小的C控制台程序,我想添加一个.ico文件,以便可执行文件看起来不错.

如何使用MinGW/gcc在CodeBlocks中执行此操作?

c windows icons codeblocks resource-files

5
推荐指数
1
解决办法
3431
查看次数

理解gnu libc的strcmp函数

这是我在glibcstrcmp中找到的函数:

int
STRCMP (const char *p1, const char *p2)
{
  const unsigned char *s1 = (const unsigned char *) p1;
  const unsigned char *s2 = (const unsigned char *) p2;
  unsigned char c1, c2;

  do
    {
      c1 = (unsigned char) *s1++;
      c2 = (unsigned char) *s2++;
      if (c1 == '\0')
        return c1 - c2;
    }
  while (c1 == c2);

  return c1 - c2;
}
Run Code Online (Sandbox Code Playgroud)

这是一个非常简单的函数,其中 的主体以和的值while启动and ,并继续直到是或和的值相等,然后返回和之间的差。c1c2*s1*s2c1nulc1c2 …

c linux glibc strcmp

5
推荐指数
1
解决办法
1104
查看次数

提取无符号32位整数的上下字

要提取无符号32位整数的高位字和低位字,并将每个字存储在单独的uint16_t变量中,我执行如下操作(nbr是无符号的32位整数):

uint16_t lower_word = (uint16_t) nbr & 0x0000FFFF;  // mask desired word
uint16_t upper_word = (uint16_t) ((nbr & 0xFFFF0000) >> 16); // right-shift after masking
Run Code Online (Sandbox Code Playgroud)

显式转换为uint16_t是不必要的吗?还有什么其他更有效的方法,如果有的话,你建议获得所需的结果而不是这种方法吗?

c cpu-word uint32 uint16

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