C语言 每当我使用for循环时字符串程序崩溃

kjthegm6  于 2022-12-22  发布在  其他
关注(0)|答案(2)|浏览(200)

我试着做一个像atoi一样的程序,你在字符串中输入一个数字,然后它把ascii值转换成一个int,为此我做了一个while循环来获取数字的维数,但是每当我尝试在while程序输出之后使用for循环时,不管for是什么
如果我删除for循环,程序可以正常运行,为什么会这样呢?
这是密码

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

int main() {
  int cont = 0, a, array[10];
  char *string;
  printf("Insert a number: ");
  scanf("%s", string);
  
  while (string[cont] != 0) {
    printf("%d\t", string[cont] - 48);
    array[cont] = string[cont] - 48;
    cont++;
  }
  for (int i = 0; i < 3; i++) {
    printf("bruh\n");
  }
}

我试着把array [i] x的值乘以10 X次,然后把它相加,我想我应该用一个for来遍历数组中的数字,然后在一个while循环中把它乘以10 X次

2wnc66cl

2wnc66cl1#

string没有指向有效的内存,因此,尝试使用scanf扫描到它会使您处于未定义行为的领域。
你需要自动地或者动态地为字符数组分配内存。

char string[1024];
scanf("%1023s", string);

使用%1023s说明符指示最大宽度,以便不会发生缓冲区溢出。还应检查scanf是否返回1以指示已成功读取一个值。

7vhp5slm

7vhp5slm2#

你需要一个value来累加数字之和,它是a吗?
也在这里

int cont = 0, a, array[10];
 char *string;

您忘记让string指向array,如

char array[10];
  char *string = array;

因此指针无效。string应为char[10]
另一个需要考虑的因素是信号,因为INT_MAX2147483647,并且有10位数,所以数组大小是可以的,所以在输入字符串中使用9和最后一个NULL是安全的,没有上溢或下溢。从-999,999,999到999,999,999所有值都符合int
请注意,scanf()在读取'\n'之前始终处于缓冲状态,因此您将执行两个循环:一个到'scanf'中的'\n',另一个到while中的'0',你仍然需要过滤字符串中的数字。
请参阅此备选方案:

#include <stdio.h>

int main(void)
{
  int n_dig = 0;
  int sig = 1;
  int value = 0;
  // may have a signal
  printf("Insert a number (optional sign + up to 9 digits): ");
  int ch = fgetc(stdin);
  if (ch == '-')
    sig = -1;
  else if (ch == '+')
    sig = 1;
  else if (ch < '0')
    return 0;
  else if (ch > '9')
    return 0;
  else
    n_dig = 1, value = ch - '0';
  // '\n' ends all
  while ((ch = fgetc(stdin)) != '\n')
  {
    if (ch < '0' || ch > '9') break;
    value = (10 * value) + (ch - '0');
    n_dig += 1;
    if (n_dig == 9) break;
  };
  if (n_dig == 0) return -1;
  printf("Decimal value is %d\n", sig * value);
  return 0;
}

差异

  • 使用fgetc()的单个循环
  • 信号正常,+-
  • 仅输入一个信号返回错误
  • 任何非数字退出循环
  • 上升到9位数,一个信号

相关问题