我想扫描像
"[25, 28] => 34"
Run Code Online (Sandbox Code Playgroud)
我写了一个小程序来测试它:
#include <cstdlib>
#include <iostream>
int main() {
char* line = "[25, 28] => 34";
char a1[100], a2[100];
int i;
sscanf(line, "[%[^,], %[^\]] => %i", a1, a2, &i);
std::cout << "a1 = " << a1 <<"\na2 = " << a2 << "\ni = "<<i <<"\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译这给出了
warning: unknown escape sequence '\]'
Run Code Online (Sandbox Code Playgroud)
和输出
a1 = 25
a2 = 28
i = -1073746244
Run Code Online (Sandbox Code Playgroud)
如果我改成它
sscanf(line, "[%[^,], %[^]] => %i", a1, a2, &i);
Run Code Online (Sandbox Code Playgroud)
我没有得到编译器投诉但仍然
a1 …Run Code Online (Sandbox Code Playgroud) 我发现%g只在需要时显示小数.如果数字是整数,则不添加尾随.000,这样就好了.但是在例如1.12345的情况下,我希望它将答案缩短为1.123.在1.000的情况下,我想只显示1,因为%g已经存在.
我试图在字符串中指定%.3g,但这不起作用.如果有人有答案,我将不胜感激!
该%n格式说明,在使用时scanf(),预计用于存储已经由所述功能处理成类型的参数的格式字符串的字符数的计数int*.据定义:
The number of characters of the format string already processed is stored in the pointed location.
但是在我的程序中,除了第一个之外它scanf()在所有scanf()程序中都有效.在我的程序中的所有s中,不包括第一个,它存储从控制台输入的字符总数的计数,包括换行符(Enter键).但是在第一个中scanf(),计数 比从控制台输入的字符和换行总数少一个.
请解释这个异常,因为我无法检测到这个简单的bug真的很令人沮丧.
#include <stdio.h>
int main ()
{
int a,b,c,d,count;
printf("First Trial\n");
scanf("%d%d%d%d%n",&a,&b,&c,&d,&count); //OUTPUT ANOMALY HERE
printf("count=%d\n",count);
printf("Second Trial\n");
scanf("%d%n",&a,&count);
printf("count=%d\n",count);
printf("Third Trial\n");
scanf("%d%d%n",&a,&b,&count);
printf("count=%d\n",count);
printf("Fourth Trial\n");
scanf("%d%n%d",&a,&count,&b);
printf("count=%d",count);
}
Run Code Online (Sandbox Code Playgroud)
样本输出
First Trial
253
34
4
83
count=11
Second Trial
25
count=3
Third Trial
234 …Run Code Online (Sandbox Code Playgroud) 我正在跟随工会
union data {
uint64_t val;
struct{
....
}
};
Run Code Online (Sandbox Code Playgroud)
我有一个功能
func(union data mydata[])
{
printf("%llu",(uint64_t)mydata[0]); // Here is the error
}
Run Code Online (Sandbox Code Playgroud)
当我编译此代码时,它给出了以下错误
error: aggregate value used where an integer was expected
Run Code Online (Sandbox Code Playgroud) 在C编程练习中,我正在做这样的事情(只是简化):
printf( "%s", 0);
Run Code Online (Sandbox Code Playgroud)
输出是
(null)
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?我假设printf将零解释为a char *,那么NULL?我怎么能用这样的东西复制这个结果
char string[] = NULL; //compiler-error
printf( "%s", string);
Run Code Online (Sandbox Code Playgroud)
?
scanf(),%[-A-B234abc]或的正确扫描集格式说明符语法是什么%[A-B234abc-]?我在 StackOverflow 上找不到答案,以下两个链接给出了相互矛盾的答案:
cplusplusreference: 不是第一个字符的破折号 (-) 可能会在某些库实现中产生不可移植的行为。
beez: 要匹配连字符,请将其作为集合中的最后一个字符:%[AC-]。
我已经尝试了scanf("%u",&number),我输入了负数,问题就在于printf("%d",number)我得到负数.我以为这会阻止我阅读负数.是scanf("%d",&number)和scanf("%u",&number)真的一样吗?或者只是为了可读性.
我在做一些叫做未定义行为的事情吗?
编辑:
从维基百科我读到这个:
%u:扫描十进制无符号整数(注意,在C99标准中,输入值减号是可选的,因此如果读取减号,则不会出现错误,结果将是负数的二进制补码,可能是非常大的价值.
阅读SO答案及以上,有点令人困惑.有人能说得更清楚吗?
我知道在使用%x时printf()我们int从堆栈中打印4个字节(十六进制).但我想只打印1个字节.有没有办法做到这一点 ?
尝试将宽度说明符与%@. 他们的工作罚款NSLog,但不与NSString stringWithFormat:。
例子:
NSString *rightAligned = @"foo";
NSString *leftAligned = @"1";
NSLog(@"| %15@ | %-15@ |", rightAligned, leftAligned);
Run Code Online (Sandbox Code Playgroud)
你会得到预期的输出:
| foo | 1 |
Run Code Online (Sandbox Code Playgroud)
但更换NSLog同stringWithFormat::
NSString *test = [NSString stringWithFormat:@"| %15@ | %-15@ |", rightAligned, leftAligned];
Run Code Online (Sandbox Code Playgroud)
并且 的值test不正确:
| foo | 1 |
Run Code Online (Sandbox Code Playgroud)
如果我将其更改为使用%s,cStringUsingEncoding:然后它可以工作:
NSString *test2 = [NSString stringWithFormat:@"| %15s | %-15s |", [rightAligned cStringUsingEncoding:NSUTF8StringEncoding], [leftAligned cStringUsingEncoding:NSUTF8StringEncoding]];
Run Code Online (Sandbox Code Playgroud)
结果与 相同NSLog。
真正奇怪的是它NSLog …
为什么操作符 ( *) 需要访问int*变量的值而不是 for char*?
char *char_ptr;
int *int_ptr;
int mem_size = 50;
char_ptr = (char *) malloc(mem_size);
strcpy(char_ptr, "This is memory is located on the heap.");
printf("char_ptr (%p) --> '%s'\n", char_ptr, char_ptr);
int_ptr = (int *) malloc(12);
*int_ptr = 31337;
printf("int_ptr (%p) --> %d\n", int_ptr, *int_ptr);
Run Code Online (Sandbox Code Playgroud)
输出:
char_ptr (0x8742008) --> 'This is memory is located on the heap.'
int_ptr (0x8742040) --> 31337
Run Code Online (Sandbox Code Playgroud)