我写了一个程序,打印出我在终端输入的数字的数字。例如,123将返回一两三。当我尝试运行程序时,在输入我的号码之后,它说该程序已停止工作。我使用Codeblocks。代码有什么问题吗?它正在编译,但它返回错误-1073741510。
#include <stdio.h>
int main (void)
{
long long int m = 0, n, digit;
printf ("Whats your number? \n");
scanf ("%lli", &n);
if (n < 0){
n = -n;
printf ("negative ");
}
if (n = 0)
printf ("zero ");
else {
while (n != 0){ //this is to reverse the number
m = m*10 + n%10;
n = n/10;
}
while (m != 0){
digit = m%10;
switch (digit){
case 0:
printf ("zero ");
break;
case 1:
printf ("one ");
break;
case 2:
printf ("two ");
break;
case 3:
printf ("three ");
break;
case 4:
printf ("four ");
break;
case 5:
printf ("five ");
break;
case 6:
printf ("six ");
break;
case 7:
printf ("seven ");
break;
case 8:
printf ("eight ");
break;
case 9:
printf ("nine ");
break;
}
m = m / 10;
}
}
return 0;
}
答案 0 :(得分:3)
这是错误的:
scanf ("%lli", n);
需要:
scanf ("%lli", &n);
scanf的参数需要是将结果放入的变量的地址。
答案 1 :(得分:1)
该行
scanf ("%lli", n);
需要
scanf ("%lli", &n);
更好的是,检查函数的返回值以确保读取输入成功。
if ( scanf("%lli", &n) != 1 )
{
// Error in reading the input.
// Deal with the error
}
答案 2 :(得分:1)
我认为你必须根据数字切换而不是m
digit = m%10;
switch (m){
case 0:
printf ("zero ");
break;
必须是
digit = m%10;
switch (digit){
case 0:
printf ("zero ");
break;
答案 3 :(得分:0)
对于初学者,您可以更改此行:
scanf ("%lli", n); //passed variable
对此:
scanf ("%lli", &n); //
// ^ ^ // Always: When you need to change the value of an
// argument, you need to pass the address
// of the value, not the value itself.
编辑 (回答评论中的问题)
在正确评估之前,您将 n 的值更改为0。你想比较它。完成以下编辑后,输入似乎正确处理...
更改行 :
if (n = 0) //ASSIGNS value of 0 to value of n
到
if (n == 0) //COMPARES value of 0 to value of n
答案 4 :(得分:0)
您应该将输入视为字符而不是数字。
您还可以使用数组作为数字文本:
const char number_as_text[] = "1234";
const char * digit_names[] =
{ "zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine"};
const unsigned int length = strlen(number_as_text);
for (unsigned int i = 0; i < length; ++i)
{
unsigned int digit_value = number_as_text[i] - '0';
puts(digit_names[i]);
puts("\n");
}
这也应该更快,因为没有除法操作。大多数处理器不喜欢分区和分区减慢它们。
答案 5 :(得分:0)
对于反转模式不适合long long
的大数字,反转将失败。改为使用递归。
下面列出了各种改进。
#include <stdio.h>
static void int_text_helper(long long neg_x) {
if (neg_x <= -10) {
int_text_helper(neg_x / 10);
fputc(' ', stdout);
}
int digit = -(neg_x % 10);
static const char *text[] = { "zero", "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine" };
fputs(text[digit], stdout);
}
int main(void) {
long long int n; // m = 0, n, digit;
// printf("Whats your number? \n"); Typo
printf("What's your number? \n");
// Note: this will read numbers like 0123 and an octal number.
scanf("%lli", &n);
// Let us work with negative numbers instead so code can handle LLONG_MIN.
if (n < 0) {
fputs("negative ", stdout);
} else {
n = -n;
}
// Use do loop (or recursion), so no special case with 0
// if (n = 0) printf("zero ");
// Let us use recursion rather than reversing the number.
// Reverse fails for a number like 9223372036854775799 (Near LLONG_MAX)
int_text_helper(n);
return 0;
}
-9223372036854775808
negative nine two two three three seven two zero three six eight five four seven seven five eight zero eight