我写了以下代码:
#include <stdio.h>
#include <stdlib.h>
void main (void) {
//------------------------ Variaveis------------------------//
char num[2];
int aux1, aux2, aux3;
//------------------------Parte grafica---------------------//
printf ("Escreva um numero de 0 a 99: ");
scanf ("%s", &num);
printf("\nEste numero por extenso eh: ");
//-------------------------Conversão------------------------//
aux1 = atoi(num);
aux2 = atoi(&num[0]);
aux3 = atoi(&num[1]);
不要介意语言,重点是,如果你输入的数字类似于&#34; 56&#34;例如,对于scanf来说,aux2获得&#34; 56&#34;的值。而不是&#34; 5&#34;我想要的,而aux3获得&#34; 6&#34;这实际上是我的预期。 aux2有什么问题?
答案 0 :(得分:3)
通过为null终止符添加空格来修复未定义的行为后,让我们考虑一下程序的行为。
aux2
有什么问题?
由于atoi
会考虑整个字符串,aux2
与aux
相同,因为它是从'5'
开始并继续'\0'
的字符串。< / p>
如果您想获得个别数字,请使用减法'0'
:
int aux2 = num[0] - '0';
int aux3 = num[1] - '0';
确保num
只有两个字符,两个字符都是数字。
答案 1 :(得分:2)
您有未定义的行为,因为当您在char num[3];
中输入2位数字值作为字符串时,您没有空终止符的空格
将其更改为char num [3]并输入为:
scanf ("%2s", num);
打印时
printf("%d %d %d\n",aux1,aux2,aux3); // for input 56
你会得到56 56 6
原因是num
和&num[0]
相同,它们指向同一地址,而&num[1]
指向下一个地址,因此你得到6