【问题标题】:Passing from string to unsigned short从字符串传递到无符号短
【发布时间】:2016-12-18 12:27:57
【问题描述】:

我有 2 个变量。一个应该是unsigned short array[10] 类型(我被要求这样做),另一个是来自scanf 的输入,方便作为字符串。
我将值一一传递,从字符串到带有 for 循环的无符号 short。
程序运行正常,但我收到警告消息。
"Warning passing argument of strcmp from incobatible pointer type""expected const char * but argument is of type short unsigned int"。 我似乎无法找到如何在没有警告的情况下从字符串传递到 unsigned short。
我的程序的简短版本在这里,以便您有更清晰的视图。

警告位于第 28,43 行。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int i, j, numberofseats;
char phone[11];
char *p;
unsigned short tempphone[10];
typedef struct
{
  char fullname[40];
  unsigned short phonenr[10];
  unsigned int seatnr;
} PASSENGERS;

int main()
{
  PASSENGERS passenger[53];
  printf("Enter Passenger's Phone Nr:");
  scanf("%s", phone);
  i = 0;
  for (p = phone; *p != '\0'; p++)
  {
    (tempphone[i]) = *p - '0';
    i++;
  }
  for (j = 0; j < numberofseats; j++)
  {
    if (strcmp(tempphone, passenger[j].phonenr) == 0)
      printf("Passenger %s has Seat Nr %u already Booked", passenger[j].fullname, passenger[j].seatnr);
  }
}

【问题讨论】:

  • 您想在某处存储tempphone 中实际使用了多少位。目前,您似乎假设 all,但您只初始化了第一个 strlen(phone) 元素。此外,您不能使用strcmp 来比较整数数组。
  • @tofro: "你想在某处存储多少位数" OP 可能会在比较实际 起作用 的那一刻知道这一点。 .. ;-)
  • 程序运行良好.. 通过更改一行 -> memcmp(tempphone,passenger[j].phonenr,sizeof(tempphone))==0) 两个警告似乎都消失了..
  • 这是在带有 unicode 项目的 Windows 环境中吗?这可能是您被要求这样做的原因。如果是,请使用 tcslen 和 tcscmp 等 unicode 例程代替 strlen 和 strcmp。
  • 是的,是的,它是带有 unicode 的窗口.. 也会检查这个!感谢大家!现在我把它留给 memcmp

标签: c string unsigned


【解决方案1】:

您可以使用 memcmp 或强制转换为 char* 并使用 strcmp。 请记住,memcmp 需要将作为第三个参数进行比较的内存大小。

你可以这样使用memcmp,

memcmp(tempphone, passenger[j].phonenr, sizeof(tempphone));

但是,如果被比较的电话号码的大小不相同并且一个以数字 0 结尾,则可能导致错误比较。 想想案例 tempphone 是 12345,passenger[j].phonenr 是 1234500000。 memcmp 可以判断电话号码是否相同,如果你不忘记初始化变量为0。你需要另一个变量来保持电话号码的长度,当然,电话号码是否总是固定的也没关系。

我会将电话号码保存在字符数组而不是短裤数组中,并使用 strcmp。电话号码是数字,但它们不是加法或除法等数学运算的对象。它们包含类似于名称的信息。

【讨论】:

  • 也非常感谢您的回答。不幸的是,我被要求这样做,所以我只是按原样使用它..另外,我已经在电话号码的完整程序的另一部分将所有值初始化为 0.. 所以也许使用 tcslen 更好还是其他人之前提出的 tcscmp?
  • "转换为 char* 并使用 strcmp" 是个坏主意,因为比较会在找到第一个 0 时停止。
  • @alk,你是对的。铸造只是抑制警告信息。问题仍未解决。
  • 所以不要只在任何地方使用字符串.. 我可以正确比较这两个无符号短裤吗? memcmp 是更好的选择吗?
  • @bakson1,如果您不能考虑将短裤数组初始化为不能是电话号码(例如 -1)的值,我会添加一个新变量来保持电话号码的长度。如果电话号码的长度不同,您还需要比较电话号码的长度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
相关资源
最近更新 更多