首页 > 解决方案 > 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对此进行了抽象。

话虽如此,我再次不确定问题是什么。

标签: carrayscharscanf

解决方案


在与“strcmp(a,b)”进行比较时,我似乎忽略了“== 0”这一事实。睡眠很重要。这就是这篇文章所教的全部内容。感谢所有寻找我在第一版中没有说明的问题的人。道歉。


推荐阅读