小编gaa*_*kam的帖子

在printf的格式字符串中使用%lu是否有效,其中PRIu32是预期的?

例如,假设我有一个i类型的变量uint32_t.打印它的预期方式是这样的:

printf("%"PRIu32"\n", i);
Run Code Online (Sandbox Code Playgroud)

但是,应该注意,要求long unsigned int至少32位宽.正确的说明符long unsigned int%lu.因此,上述陈述可以替换为:

printf("%lu\n", i);
Run Code Online (Sandbox Code Playgroud)

我想是的,因为我没有理由不这样做.但是,如果是,那么这将消除对PRIu32这些宏化说明符的存在的需要,所以我想我最好问一下.

我问它的原因是我想printf动态创建一个格式字符串,如果我不知道字符串的大小PRIu32扩展为(以及是否sizeof(PRIu32)是否有效可能值得一个单独的问题).

在任何情况下,我认为它应该是有效的写:

printf("%lu\n", (long unsigned)i);
Run Code Online (Sandbox Code Playgroud)

c int format-specifiers

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

为什么在迭代字典的项目并修改其值时,是否有必要临时将密钥保存到列表中?

这个答案:

foreach (var key in dict.Keys.ToList())
{
    dict[key] = false;
}
Run Code Online (Sandbox Code Playgroud)

对ToList()的调用使这个工作,因为它正在拉出并(暂时)保存键列表,因此迭代工作.

为什么ToList()这里需要打电话?

我们正在修改值,而不是钥匙,而且,我最了解,仅modyfying设定一个词典的按键会打破遍历所有键.特别是 - 对我来说,可能是错误的理解 - 只有当我们在字典中添加或删除项目时才能改变键的顺序,我们没有这样做.

.net c# dictionary

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

如何仅修改记录的一个字段而不完全重写它?

这是我第二次解决这个问题... 这是第二次在与Statemonad 一起工作时,显然一个州喜欢由许多领域组成,而不仅仅是一个领域

我有一个元组:

type CurrentState = (Int, Int, String, [Int], CustType1, CustType2, CustType3 )
Run Code Online (Sandbox Code Playgroud)

假设需要对该元组进行简单的转换...第二个Int是一种计数器,它需要增加:

let incrementCounter currState@(foo, bar, baz, fizz, buzz, blah, yadda) =
    ( foo, bar+1, baz, fizz, buzz, blah, yadda )
Run Code Online (Sandbox Code Playgroud)

哇。很多打字。现在,既然增加计数器并不是该元组的唯一可能操作,那么显然会有更多此类功能……混乱很快就会变得令人讨厌。

如果我们将元组更改为记录怎么办?

data CurrentState = CurrentState { foo :: Int, bar :: Int, baz :: String,
                                   fizz :: [Int], buzz :: CustType1,
                                   blah :: CustType2, yadda :: CustType 3 }
Run Code Online (Sandbox Code Playgroud)

现在增加计数器就更糟了!

let incrementCounter currState =
    CurrentState { foo = foo currState, …
Run Code Online (Sandbox Code Playgroud)

haskell tuples record variable-assignment

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

如何只修改一个元组的一个元素而不完全重写它?

如何仅修改记录的一个字段而不完全重写它?

在这里,我学到了一种有用的Haskell语法,可以在不完全重写记录的情况下修改记录的元素:

oldrecord { somefield = newvalue }
Run Code Online (Sandbox Code Playgroud)

元组是否有类似的可能?

type ABigTuple = (Int, Int, Double, Int, String)

aBigTuple :: ABigTuple
aBigTuple = (5, 6, 3.2, 10, "asdf") 

anotherBigTuple = -- replace the 3rd elt of the prev tuple with 5.5 i/o 3.2
Run Code Online (Sandbox Code Playgroud)

这是否有可能类似于记录,还是我必须重写整个元组?

haskell tuples variable-assignment

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

如何将行号传递给异常?

我不知道这是否通常是所有C ++代码的通用建议,但是至少在某些情况下,建议不要使用assert宏,而是抛出异常

我一直对此方法有疑问。我怎么知道哪条线触发了异常?

好吧,是的,我们有__LINE__预处理器常量。但是,通过它并不容易。

我尝试的方法:

#include <stdexcept>

int main() {
  throw std::logic_error("__LINE__");
}
Run Code Online (Sandbox Code Playgroud)

 

terminate called after throwing an instance of 'std::logic_error'
  what():  __LINE__
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

好吧,这不正是我想要的。让我们再试一次:

#include <stdexcept>

int main() {
  throw std::logic_error(__LINE__);
}
Run Code Online (Sandbox Code Playgroud)

 

wtf.cc: In function ‘int main()’:
wtf.cc:4:34: error: invalid conversion from ‘int’ to ‘const char*’ [-fpermissive]
   throw std::logic_error(__LINE__);
                                  ^
In file included from wtf.cc:1:0:
/usr/include/c++/7/stdexcept:124:5: note:   initializing argument 1 of ‘std::logic_error::logic_error(const char*)’
     logic_error(const char*) _GLIBCXX_TXN_SAFE;
     ^~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

咄。我要什么 好的,让我们再试一次,这次正确了:

#include <stdexcept> …
Run Code Online (Sandbox Code Playgroud)

c++ exception line-numbers

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

我该如何初始化pthread互斥锁?

#include <pthread.h>

pthread_mutex_t* mut;

int main()
{
        mut = PTHREAD_MUTEX_INITIALIZER;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码吐出来了error: expected expression before ‘{’ token.

#include <pthread.h>

pthread_mutex_t* mut = PTHREAD_MUTEX_INITIALIZER;

int main()
{

}
Run Code Online (Sandbox Code Playgroud)

上面的代码吐出警告:标量初始化器周围的括号

那么我应该如何初始化互斥锁呢?

c mutex initialization pthreads

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

默认情况下,为什么MS Visual Studio #include <stdio.h>在stdafx.h中?

MS Visual Studio 2017,来自VisualC++类别的新Windows控制台应用程序项目.默认stdafx.h标头包含以下行:

#include <stdio.h>
#include <tchar.h>
Run Code Online (Sandbox Code Playgroud)

在他们下面:

// TODO: reference additional headers your program requires here
Run Code Online (Sandbox Code Playgroud)

因为这个评论被放在下面,而不是上面#include <stdio.h>,我倾向于认为stdio.h默认情况下包含这个评论并不是为了方便用户#include,但是出于某种原因需要它?stdio.h包含而不仅仅是这个事实cstdio似乎支持这种解释?

我对吗?我可以安全地删除#include <stdio.h>吗?我问,因为我main函数的第一行是:

std::ios_base::sync_with_stdio(false);
Run Code Online (Sandbox Code Playgroud)

如果stdio正在使用设施,这显然是不正确的,因为包含的这个标题会提示.

1)我可以安全地删除#include <stdio.h>从中说出的行stdafx.h吗?

2)我可以安全地打电话std::ios_base::sync_with_stdio(false)吗?

3)tchar.h此处默认包含的事实是否相关?

c++ stdafx.h visual-studio visual-c++

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

通过将GET请求数据特定绑定到页面模型属性,可以引入哪些类型的安全漏洞?

我正在阅读有关ASP .NET Core和Razor Pages的教程.

其中一个,在处理BindProperty属性时,有一些我觉得难以理解的评论:

默认情况下,Razor Pages仅使用非GET谓词绑定属性.绑定到属性可以减少必须编写的代码量.绑定通过使用相同的属性来呈现表单字段(<input asp-for="Customer.Name" />)并接受输入来减少代码.

出于安全原因,您必须选择将GET请求数据绑定到页面模型属性.在将映射映射到属性之前验证用户输入.在处理依赖于查询字符串或路由值的方案时,选择此行为非常有用.

要在GET请求上绑定属性,请将[BindProperty]属性的 SupportsGet属性设置为true:[BindProperty(SupportsGet = true)]

(强调我的)来源:ASP.NET核心中的Razor页面简介§编写基本表单

我不明白.为什么在专门处理GET请求时需要采取额外的安全措施?

据我所知,GET请求应该比POST请求更安全,更安全,因为GET只检索数据,而POST则将数据发送到服务器.因此,POST请求通常需要额外的安全措施GET reqs不需要.

然而现在我正在读取用POST做X很好但是小心,不要肆无忌惮地使用GET,你必须选择加入并加以警告,采取预防措施!

为什么这些警告是必要的?将GET请求数据绑定到页面模型属性可以引入哪些安全漏洞?为什么这些漏洞不适用于POST请求?

security asp.net-core asp.net-core-2.0

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

为什么修改数据库数据的查询是等待的,而只读取数据的查询不是?

我可以异步地将新行写入数据库:

await dbContext.Chatlogs.AddAsync(new ChatMessage(messageString, time, author));
await dbContext.SaveChangesAsync();
Run Code Online (Sandbox Code Playgroud)

但是只是从数据库中读取内容呢?

string firstMessageEverPosted = dbContext.Chatlogs.OrderBy(msg => msg.time).First().content;
Run Code Online (Sandbox Code Playgroud)

不,await这里 并且插入await会导致编译错误:

string doesntWork = await dbContext.Chatlogs.OrderBy(msg => msg.time).First().content;
Run Code Online (Sandbox Code Playgroud)

我是否遗漏了某些内容,或者无法异步读取数据库中的内容?如果是这样,我很好奇只是阅读内容的根本不同之处在于,允许异步执行此操作并不合适?

c# asynchronous async-await entity-framework-core

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

是否有可能只具有另一种数据类型的一个构造函数的数据类型?

我有一个(非常复杂的)数据类型:

data SomeDataType = Constructor Blah Blah Blah | OtherConstructor Blah Yadda | YetAnotherConstructor Yadda Yadda Tittle | StillOneMoreConstructor Tittle Tattle Wish Wash
Run Code Online (Sandbox Code Playgroud)

现在,我发现自己想要另一种数据类型…具有两个构造函数。之一将是相同YetAnotherConstructorSomeDataType; 另一个只会存储一个Double。我有什么选择?

data WantedDataType = ConstructorName1 Double | ConstructorName2 SomeDataType
Run Code Online (Sandbox Code Playgroud)

虽然这可行,但也可以允许ConstructorName2 $ StillOneMoreConstructor tittle tattle wish wash没有意义的东西。

data WantedDataType = ConstructorName1 Double | ConstructorName2 Yadda Yadda Tittle
Run Code Online (Sandbox Code Playgroud)

再说一次,这是可行的,但在我看来,这违反了DRY的规定,将东西往返于WantedDataType和转换可能很乏味SomeDataType

data WantedDataType = ConstructorName1 Double | YetAnotherConstructor Yadda Yadda Tittle
Run Code Online (Sandbox Code Playgroud)

这就是我最想要的,但是不幸的是,Haskell似乎并不支持这种多态性(构造函数不能同时属于两种数据类型)。

我有什么选择?我该如何解决?

constructor haskell types

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