c - C:使用 scanf 将“字符串”放入 char 数组时,char 数组中的附加字符,
问题描述
我遇到了关于字符串(字符数组)比较的问题。
下面的代码不是我的程序,而是我正在做的模拟。
我有一个结构,它存储一个项目的名称。
我稍后让用户使用输入名称搜索项目,该输入名称
将结构项目的实例名称(如 Xenon)与该用户输入相匹配。
但是,输入字符串包含乱码,我将对此进行说明。
我在我的字符末尾添加了 '\0',所以这应该不是问题,
除非我做错了。
更清楚地说,
A 用户输入“Xenon”,因此我们找到名称值为“Xenon”的 struct Item 实例。
// Section #A
// I store structs in this dynamically allocated array.
// Later, users can access item instances, if needed.
struct Item *struct_arr = malloc( sizeof(struct Item)*SIZE );
struct Item
{
char name[16];
float price;
int quantity;
int id_num;
};
struct Item item1;
strcpy(item1.name, "Xenon"); // i explicitly set this instance
item1.price = 125;
item1.quantity = 2;
item1.id_num = 1;
struct_arr[0] = item1;
// Section #B
char name[16]; // also tried 17
name[16] = '\0'; // or 17, tried 17
scanf("%s", name); // assume I enter, "Xenon"
// res outputs 2
int res = strcmp(item1.name, name); // They are not the same, though when printed, "Xenon" and "Xenon"
// THE ISSUE IS BELOW : THE SOLUTION IS SET strcmp == 0
for (int i=0; i < SIZE; i++) {
if (strcmp(struct_arr[i].name, name)) { // strcmp(struct_arr[i].name, name) == 0
int res = strcmp(struct_arr[i].name, name); * #A
break;
}
}
// i then proceeded to gdb to see what was going on. Read on
在 gdb 中,我在程序中
使用用户输入(存储在 char 数组“名称”中)
来选择正确的 struct Item 实例。
Gdb 给出如下结果:
print name
"Xenon\000\000\000\372ǧ\367\377\177\000"
print item1.name
"Xenon\000\000\000\000\000\000\000\000 \000\000"
这可能很麻烦,但我将包含来自 C 的 printf 结果。
该结果同时查看并行字符;也就是说,从 i=0 到 i<16,它查看 item1.name[i] 和 name[i]。
// Output is i, item1.name[i], name[i]
each: i is 0,X,X
each: i is 1,e,e
each: i is 2,n,n
each: i is 3,o,o
each: i is 4,n,n
each: i is 5,,
each: i is 6,,
each: i is 7,,
each: i is 8,,▒
each: i is 9,,G
each: i is 10,,▒
each: i is 11,,▒
each: i is 12,,A
each: i is 13,
each: i is 14,,
each: i is 15,,
显然这两个字符串是不一样的。
用户输入的字符串内部有些乱码,
而 item1.name 的字符串看起来相当“干净”。
我不确定问题是什么。
我的逻辑是,虽然 name[16] 不在我保留的内存中,但
如果我们在 name[15] 之后放置 '\0',那么如果我们在迭代 name 时确实点击了 '\0',
我们仍然会遇到那个内存位置,因为 15 和 16 在内存中是相邻的。
我不认为这是问题所在。
此外,当我设置 item1 的属性“name”时,它隐含地添加了“\0”,
因为我们正在为数组 char name[16] 分配一个字符串“”,而不是一个 char ''。C对此进行了抽象。
话虽如此,我再次不确定问题是什么。
解决方案
在与“strcmp(a,b)”进行比较时,我似乎忽略了“== 0”这一事实。睡眠很重要。这就是这篇文章所教的全部内容。感谢所有寻找我在第一版中没有说明的问题的人。道歉。
推荐阅读
- jquery - 确定是按月付款还是按年付款
- powershell - 如何通过 Caml 克服 SharePoint Online 5000 行限制?
- angular - 以角度运行异步代码的语法
- javascript - 如何创建创建新网格项 onClick 的函数?Vuex 使用 vue-grid-layout
- javascript - Rxjs 可以将其更改为返回布尔值吗?
- python - 如果索引位置值在变量中定义,可以通过索引位置访问 Jinja 模板变量吗?
- c# - 如何在一个解决方案中添加多个名称空间和类
- python-3.x - 从特定键中具有最高值的字典列表中返回字典
- pandas - Pandas Merge:列标签不唯一
- sql-server - 来自 Powerbuilder 游标错误的存储过程调用