任务:将欧姆从1 kOhm转换为1000 Ohm,等等,并找到最大值和最小值。
例:
1千瓦
2欧姆
然后转换为
1000欧姆
2欧姆
但是输入后只能得到
1千瓦
欧姆
输入必须带有空格。程序首先从每个新行中删除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
最佳答案
混合fgetsw
和wscanf
是个坏主意。
问题在这里:
...
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);
}
...
但是最好不要将
wscanf
和fgetsw
放在第一位。我想您使用Visual Studio。如果是,请学习如何使用调试器,它非常易于使用且功能强大。如果没有,请学习如何使用调试器。
但是在您的程序中可能还有其他问题与您的问题无关,我没有检查。
关于c - 错误的控制台读取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47281368/