【问题标题】:post and pre increment in for loop. string length without library function in Cfor 循环中的 post 和 pre 增量。 C中没有库函数的字符串长度
【发布时间】:2015-09-03 15:50:07
【问题描述】:

我正在尝试使用库函数查找字符串的长度。

char card[16];                  //card number in char array.
unsigned int cardno[16]={0};    //card number in int array for calculations.

int i,length=0,len;
printf("Credit Card Number[without any spaces]: "); 
gets(card);

for(i=0;card[i]!='\0';i++);
len=i;
length=strlen(card);

printf("%d %d",len,length);

但是如果我输入一个 16 位的卡号,输出是 16 17 但除此之外[卡号小于 16 位] 两个输出是相同的。 这是前后增量的影响还是其他一些东西。 请解释一下。

【问题讨论】:

  • 您使用哪种编程语言?
  • @slartidan 我使用 C 语言。
  • 不要使用 'gets()' 它已被贬低,在下一个 C 标准中被删除,它(以及其他问题)允许用户溢出输入缓冲区。强烈建议使用'fgets()'。超出输入缓冲区会导致未定义的行为,这可能/将导致段错误事件
  • 在 C 中,字符串以 NUL 字符 ('\0') 结束。一张信用卡(通常)有 16 个数字。所以在读取值时,需要为 NUL 字符留出空间。 (并且当您使用 fgets() 时,还需要为结尾的 '\n' 留出空间(在大多数操作系统中是单个字符,但在 Windows/DOS 中是两个字符。
  • for 循环末尾的分号是一个非常糟糕的主意。我们无法判断这是一个错字(通常是),还是故意的。如果有意,请将分号单独放在一行。

标签: c post-increment pre-increment


【解决方案1】:

快速回答是使用fgets() 替换gets()

char *fgets(char *str, int n, FILE *stream)

n -- 这是要读取的最大字符数(包括最后的空字符)。通常,使用作为 str 传递的数组的长度。

使用gets()函数是不安全的,这可能会导致堆栈溢出:)例如如果您想在卡中输入 16 位数字卡号[16],则没有地方输入“\0”。

【讨论】:

  • 我猜你的编译工具不是 gcc ?因为 gcc 会这样友好地提醒你,“`gets' 函数是危险的,不应该使用”。
【解决方案2】:

首先,对于 16 位数字,您需要一个更长的 char 数组:

char card[17];  // 16 digits + `\0`  

然后试试这个:

for(len=0; card[len] != '\0'; len++);

不要依赖i 在循环之外的值。

【讨论】:

  • 它正在工作。谢谢。你能解释一下为什么它不能以我的方式工作吗?
  • 见上面@user3629249 的评论。你有缓冲区溢出。当您输入 16 位字符串时,您在 card[16] 中写入了 \0 char,而您的缓冲区被声明为 char card[16],最后一个可用插槽位于 card[15]。第二部分仅仅是可读性/可理解性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
相关资源
最近更新 更多