小编Nei*_*eil的帖子

函数如何存储在内存中?

我一直在深入研究Linux和C,我很好奇函数是如何存储在内存中的.我有以下功能:

void test(){
    printf( "test\n" );
}
Run Code Online (Sandbox Code Playgroud)

很简单.当我在具有此功能的可执行文件上运行objdump时,我得到以下内容:

08048464 <test>:
 8048464:       55                      push   %ebp
 8048465:       89 e5                   mov    %esp,%ebp
 8048467:       83 ec 18                sub    $0x18,%esp
 804846a:       b8 20 86 04 08          mov    $0x8048620,%eax
 804846f:       89 04 24                mov    %eax,(%esp)
 8048472:       e8 11 ff ff ff          call   8048388 <printf@plt>
 8048477:       c9                      leave
 8048478:       c3                      ret
Run Code Online (Sandbox Code Playgroud)

一切看起来都正确.有趣的是,当我运行以下代码时:

int main( void ) {
    char data[20];
    int i;    
    memset( data, 0, sizeof( data ) );
    memcpy( data, test, 20 * sizeof( char ) ); …
Run Code Online (Sandbox Code Playgroud)

c linux memory function objdump

9
推荐指数
2
解决办法
4485
查看次数

写入Rust中的文件或标准输出

我正在学习Rust,我有点难过.

我正在尝试为用户提供将输出写入stdout或提供的文件名的选项.

我开始与那正是使用给出的示例代码extra::getopts位于这里.从那里,在do_work函数中,我正在尝试这样做:

use std::io::stdio::stdout;
use std::io::buffered::BufferedWriter;

fn do_work( input: &str, out: Option<~str> ) {
    println!( "Input:  {}", input );
    println!( "Output: {}", match out {
        Some(x) => x,
        None    => ~"Using stdout"
    } );
    let out_writer = BufferedWriter::new( match out {
        // I know that unwrap is frowned upon, 
        // but for now I don't want to deal with the Option.
        Some(x) => File::create( &Path::new( x ) ).unwrap(),
        None    => stdout()
    } ); …
Run Code Online (Sandbox Code Playgroud)

file stdio rust

6
推荐指数
2
解决办法
3672
查看次数

在C中读取字符时打印

我正在尝试编写一个简单的小代码片段来响应箭头按键.我知道up由^ [[A表示,我有以下代码检查该序列:

     while( 1 )
     {
         input_char = fgetc( stdin );

         if( input_char == EOF || input_char == '\n' )
         {
             break;
         }

         /* Escape sequence */
         if( input_char == 27 )
         {
             input_char = getc( stdin );

             if( input_char == '[' )
             {
                 switch( getc( stdin ) )
                 {
                     case 'A':
                     printf("Move up\n");
                     break;
                 }
             }
         }
     }
Run Code Online (Sandbox Code Playgroud)

每当我点击"向上"时,转义序列(^ [[A]显示在屏幕上,但"上移"直到我按下回车才出现.

最终目标是用其他一些数据替换当前行上的文本,所以我试着这样做

printf("\r%s", "New Text");
Run Code Online (Sandbox Code Playgroud)

取代"向上移动",但在按下输入后仍然不会显示.

我在读字的方式有问题吗?

谢谢!

编辑快速注释,它适用于*nix系统.

解决方案 感谢大家的指点.我选择了stepanbujnak的解决方案,因为它非常简单.我注意到的一件事是修改字符串(退格等)的键的很多行为与你期望的不同.它会在线上退出任何东西(包括printf'd的东西),我不得不考虑到这一点.在那之后,让其他人排成一行并不太糟糕:)

c printf newline stream carriage-return

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

别名列数据库级别的名称[MySQL]

"别名"可能是错误的单词,因为它在将列/表名称引用为查询中的其他内容时使用.

我感兴趣的是,如果有一种方法可以在数据库中为列提供两个名称.如果我打印这样的表,它看起来像这样:

mysql> SELECT * FROM User;
+--------------------------+-----------------+
| id | username | uname    | password | pswd |
+----+---------------------+-----------------+
|  0 | bob_jones@gmail.com |    some_pw_hash | 
|  1 | sue_smith@gmail.com |    some_pw_hash |
+--------------------------------------------+ 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,username并且uname在查询语句中将是同义词,就像passwordpswd.

所以以下语句将具有相同的输出:

mysql> SELECT id, username FROM User;
...
mysql> SELECT id, uname FROM User;
...
Run Code Online (Sandbox Code Playgroud)

我想避免做类似的事情

mysql> SELECT id, username AS uname FROM User;
Run Code Online (Sandbox Code Playgroud)

那么,这样的功能是否存在?

干杯,尼尔

mysql sql

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

标签 统计

c ×2

carriage-return ×1

file ×1

function ×1

linux ×1

memory ×1

mysql ×1

newline ×1

objdump ×1

printf ×1

rust ×1

sql ×1

stdio ×1

stream ×1