gpt4 book ai didi

c - 控制台读取错误

转载 作者:行者123 更新时间:2023-11-30 16:38:55 25 4
gpt4 key购买 nike

任务:将欧姆从 1 kOhm 转换为 1000 Ohm 等,并找到最大值和最小值。

示例:

1 kOhm

2 欧姆

转换后为

1000 欧姆

2 欧姆

但输入后仅获取

1 kOhm

欧姆

输入时必须有空格。程序从第一行之后的每个新行中删除 1 个字符。我尝试使用 wscanf 和其他想法,但它对我不起作用。

附注我必须使用 wchar_t

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

int pow(int base, int exp) {
if (exp < 0)
return -1;

int result = 1;
while (exp) {
if (exp & 1)
result *= base;
exp >>= 1;
base *= base;
}

return result;
}
int transformSize(wchar_t name) {

if (name == L'h') {
return 2;
} else if (name == L'k') {
return 3;
} else if (name == L'M') {
return 6;
} else if (name == L'G') {
return 9;
} else if (name == L'T') {
return 12;
} else if (name == L'P') {
return 15;
} else if (name == L'E') {
return 18;
} else if (name == L'Z') {
return 21;
} else if (name == L'Y') {
return 24;
}

return 0;
}

int main() {

unsigned int *numbers;
unsigned int min = 0;
unsigned int max = 0;
int n = 0;
wchar_t **array;
setlocale(LC_ALL, "");

wprintf(L"Enter n: ");
wscanf(L"%d", &n);

array = malloc(n * sizeof(wchar_t *));
numbers = malloc(n * sizeof(unsigned int *));

wprintf(L"Enter n-elements: \n");

for (int i = 0; i < n; i++) {
wchar_t temp;
array[i] = malloc(256 * sizeof(wchar_t));
wscanf(L"%c", &temp);
fgetws(array[i], 2560, stdin);
}

wprintf(L"\n\nStart array: [");

for (int i = 0; i < n; i++) {
wprintf(L" ");
wprintf(L"%ls", array[i]);
wprintf(L" ");
}

wprintf(L"]\n\n");

for (int i = 0; i < n; i++) {
int spaceIndex = 0;
for (int j = 0; j < wcslen(array[i]); j++) {
if (array[i][j] != ' ') {
spaceIndex++;
} else {
break;
}
}

wchar_t *new = malloc(sizeof(wchar_t) * spaceIndex + 1);
wcsncpy(new, array[i], spaceIndex);
new[n] = '\0';
numbers[i] = wcstol(new, (wchar_t **)NULL, 10) *
(pow(10.0, (double)transformSize(array[i][spaceIndex + 1])));

if (i == 0) {
min = numbers[i];
max = numbers[i];
}

if (numbers[i] >= max) {
max = numbers[i];
}

if (numbers[i] <= min) {
min = numbers[i];
}

free(new);
}

wprintf(L"Converted array: [");

for (int i = 0; i < n; i++) {
wprintf(L" %ld Ohm ", numbers[i]);
}

wprintf(L"]\n\n");

wprintf(L"Max element: %ld Ohm\n", max);
wprintf(L"Min element: %ld Ohm\n", min);

for (int i = 0; i < n; i++) {
free(array[i]);
}

free(array);

return 0;
}

当前程序输入/输出示例:

Enter n: 3
Enter n-elements:

12 kOhm
3 kOhm
1 Ohm

// Must be 12 kOhm, 3 kOhm, 1 Om
Start array: [ 12 kOhm
kOhm
Ohm
]
// Must be 12000 Ohm, 3000 Ohm, 1 Ohm
Converted array: [ 12000 Ohm 0 Ohm 0 Ohm ]

Max element: 12000 Ohm
Min element: 0 Ohm

最佳答案

混合使用 fgetswwscanf 是一个坏主意。

问题出在这里:

  ...
for (int i = 0; i < n; i++) {
wchar_t temp;
array[i] = malloc(256 * sizeof(wchar_t));
wscanf(L"%c", &temp);
fgetws(array[i], 2560, stdin);
}
...

您正在使用 wscanf(L"%c", &temp); 来吸收 wscanf 留下的换行符。您应该只在 wscanf 之后执行一次此操作,如下所示:

  ...
wchar_t temp;
wscanf(L"%c", &temp);

for (int i = 0; i < n; i++) {
array[i] = malloc(256 * sizeof(wchar_t));
fgetws(array[i], 2560, stdin);
}
...

但最好不要首先混合使用 wscanffgetsw

我想您使用的是 Visual Studio。如果是的话,学习如何使用调试器,它非常容易使用并且非常强大。如果不是,请了解如何使用调试器。

但是在你的程序中可能还有其他与你的问题无关的问题,我没有检查。

关于c - 控制台读取错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47281368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com