J'essaie de saisir un numéro de téléphone et de l'imprimer dans ce format (888)999-1111, mais lorsque j'essaie de l'imprimer, j'obtiens une sortie étrange qui n'est pas ce que je m'attends à récupérer . J'imprime les valeurs du téléphone à la fois dans l'entrée et dans la fonction d'impression bt elles sont différentes. Celui de la fonction d'entrée est correct mais il n'est pas correct dans la fonction d'impression. Merci d'avance pour l'aide.
int phoneInput(void)
{
long int phone = 0;
printf("Input the politicians phone number with no speaces: ");
scanf("%ld", &phone);
printf("test : %ld", phone);
return phone;
}
int printPhone(long int phone)
{
int i = 10; //the number of digits in the phone
char output[11];
printf("Test: %ld", phone);
for (i = 0; i < 10; i ++)
{
while (phone > 0)
{
output[i] = phone % 10;
phone /= 10;
}
}
printf("- Phone number: (");
i = 0;
for (i = 0; i < 3; i++)
{
printf("%d", output[i]);
}
printf(")");
i = 3;
for(i = 3; i < 6; i++)
{
printf("%d", output[i]);
}
i = 6;
printf("-");
for(i = 6; i < 10; i++)
{
printf("%d", output[i]);
}
return 0;
}
6 Réponses :
La seule raison pour laquelle vous auriez besoin de stocker une valeur sous la forme d'un int , d'un long int ou d'un autre type numérique est si vous deviez faire de l'arithmétique dessus ( à moins que cela ne soit requis par une spécification de devoir). Ne vous laissez pas berner par le fait qu’un numéro de téléphone est composé de chiffres - il est plus judicieux d’être stocké sous forme de chaîne!
Si vous pouvez stocker le numéro de téléphone sous forme de chaîne, vous devrait:
printf("(%.3s)%.3s-%.4s\n", phone, phone + 3, phone + 6);
Une fois que vous avez cela, il est plus facile d'effectuer une manipulation de chaîne dessus:
char *phoneInput(void)
{
static char phone[100];
printf("Input the politicians phone number with no speaces: ");
fgets(phone, 100, stdin);
return phone;
}
Merci! Je veux bien essayer!
Cette réponse identifie bien un problème majeur d'entrée / de conception, mais OP while (phone> 0) {output [i] = phone% 10; téléphone / = 10; } est également une erreur sérieuse.
@chux je suis d'accord; avec ma solution, toute cette boucle n'est même pas nécessaire
Les variables @antonyjr static vont dans la section de données d'un processus, pas sur la pile.
@sarah Si vous trouvez que ma réponse a résolu votre problème, n'hésitez pas à l'accepter .
Sarah, tout d'abord je scannerais le numéro de téléphone sous forme de chaîne, c'est plus facile de le faire de cette façon. Une autre raison de l'analyser en tant que chaîne long int peut ne pas être suffisante, sur certaines plates-formes, la longueur est de 32 bits. Mais si vous avez besoin de 'long int`, la meilleure façon serait:
fscanf( stdin, " %3s%3s%4s", areacode, zone, number);
printf("(%s) %s-%s\n", areacode, zone, number);
une autre façon serait:
printf ("(%ld)", number / 10000000); // prints area code (xxx)
printf (" %ld-", (number / 1000) % 1000); // prints xxx-
printf ("%ld\n", number % 10000); // prints xxxx\n
long ne peut être que 32 bits. Insuffisant pour les OP (888)999-1111
@chucks merci pour votre contribution, je l'apprécie vraiment. Maintenant que j'y pense, le téléphone Cisco que j'utilise tous les jours utilise un processeur 16 bits. :)
"sur certaines plates-formes, la longueur est de 32 ou 16 bits" -> long est toujours au moins 32 bits (exigence C), même sur 16 bits, 8- processeurs bit ou 1 bit
@chux Je l'ai à nouveau édité mais je pense que Cisco est l'une de ces entreprises qui ne se soucient pas du standard C.
C'est OK si Cisco n'est pas conforme - c'est leur choix. Cela signifie simplement qu'un tel compilateur n'est pas un compilateur C, juste un compilateur de type C et que ses problèmes sont moins pertinents pour ce post marqué C.
Les téléphones LOL cisco sont une histoire amusante qu'ils font au minimum en C et le reste est tout Java, c'est pourquoi mon PC de 10 ans sous Linux démarre plus rapidement que le téléphone Cisco.
J'ai apporté quelques modifications à votre code. Veuillez jeter un œil.
long long int phoneInput(void)
{
long long int phone = 0;
printf("Input the politicians phone number with no speaces: ");
scanf("%lld", &phone);
printf("test : %lld", phone);
return phone;
}
int printPhone(long long int phone)
{
int i = 10; //the number of digits in the phone
char output[11];
printf("Test: %lld", phone);
i = 9; // removed for loop that was unnecessary.
while (phone > 0)
{
output[i] = phone % 10;
phone /= 10;
i--;
}
printf("- Phone number: (");
i = 0;
for (i = 0; i < 3; i++)
{
printf("%d", output[i]);
}
printf(")");
i = 3;
for(i = 3; i < 6; i++)
{
printf("%d", output[i]);
}
i = 6;
printf("-");
for(i = 6; i < 10; i++)
{
printf("%d", output[i]);
}
return 0;
}
int main(int argc, char const *argv[])
{
long long int n = phoneInput();
printPhone(n);
return 0;
}
printf("%c", output[i]);
Votre boucle n'incrémente pas la valeur de i , elle continuera donc à écrire dans le même index dans la sortie
Dans votre code existant, le problème réside dans les boucles:
Input the politicians phone number with no spaces: 8889991111 test : 8889991111 Test: 8889991111 - Phone number: (888)999-1111
Votre boucle interne continuera à s'exécuter sans incrémenter i provoquant la même position dans le tableau à être écrit encore et encore.
#include <stdio.h>
#include <string.h>
long int phoneInput(void)
{
long int phone = 0;
printf("Input the politicians phone number with no spaces: ");
scanf("%ld", &phone);
printf("test : %ld\n", phone);
return phone;
}
int printPhone(long int phone)
{
int i = 10; //the number of digits in the phone
char output[11];
memset(output, '0', sizeof(output));
printf("Test: %ld\n", phone);
i = 9;
do
{
output[i] = (phone % 10) + '0';
phone /= 10;
i--;
}while( (phone > 0) && (i >= 0));
printf("- Phone number: (");
i = 0;
for (i = 0; i < 3; i++)
{
printf("%c", output[i]);
}
printf(")");
i = 3;
for(i = 3; i < 6; i++)
{
printf("%c", output[i]);
}
i = 6;
printf("-");
for(i = 6; i < 10; i++)
{
printf("%c", output[i]);
}
return 0;
}
void main()
{
long int phone;
phone = phoneInput();
printPhone(phone);
}
Veuillez utiliser "% c" dans le printf lors de l'impression de la sortie . p>
Liste des problèmes dans le code publié par OP. Ce ne sont que des problèmes dans le code posté par OP. La logique peut être faite de nombreuses autres manières, mais, La réponse se concentre uniquement sur les problèmes dans le code d'OP tel quel:
La fonction
phoneInputdoit renvoyerlong intau lieu deintboucle for et while- Deux boucles ne sont pas nécessaires. C'est la principale erreur. Cela entraîne à chaque fois le remplacement de la même position dans le tableau.- Le compteur de boucle pour la position du tableau commence à 0, ce qui entraîne l'écriture des chiffres dans l'ordre inverse dans le tableau
- Depuis, vous utilisez un tableau char, stockez et imprimez char au lieu de int.
Code complet avec problèmes résolus (selon le code d'origine de l'OP):
i = 9;
do
{
output[i] = (phone % 10) + '0';
phone /= 10;
i--;
}while((phone > 0) && (i >= 0));
Résultat:
for (i = 0; i < 10; i ++)
{
while (phone > 0)
{
output[i] = phone % 10;
phone /= 10;
}
}
Le downvoter peut-il laisser un commentaire afin que je puisse améliorer la réponse?
Ce n'est pas le downvoter, mais ce que vous faites, c'est attribuer des chiffres à la sortie , qui dans le code de OP est un tableau de char (qui doit être converti en représentation textuelle)
NMDV, Cette réponse souligne correctement un problème sérieux dans le code d'OP. D'autres importants existent également.
@GovindParmar, merci! J'ai édité le code. Je voulais juste souligner l'erreur clé dans le code de l'OP. Mais, je suis d'accord que j'aurais dû régler cela aussi.
@chux, merci pour votre commentaire. Je suis d'accord. Je me suis juste concentré sur l'erreur principale provoquant une erreur dans les valeurs de sortie.
Notez que le while ((phone> 0) && (i <10)) empêchera d'imprimer quoi que ce soit pour "Operator" 0 . Peut-être un do {} while (); à la place?
@chux, merci pour vos commentaires. J'ai maintenant ajouté le code fixe complet. Merci de m'aider à améliorer la réponse.
@GovingParmar, merci encore pour vos commentaires. J'ai maintenant ajouté le code fixe complet. Merci de m'aider à améliorer la réponse.
Un numéro de téléphone doit être stocké comme pays , zone , abonné .
L'exemple que vous avez donné serait 1 888 9991111
Et notez que tout 00 de début pour un numéro de pays est en fait la méthode locale pour demander au commutateur de composer un numéro international . En Espagne, c'était 9 pendant longtemps. L'identification générique pour la composition de numéros internationaux est désormais + .
Voir aussi https://www.internationalcitizens.com/international-calling-codes/
Après
output [i] = phone% 10;, essayezoutput [i] + = '0';pour convertir deinten caractère représentant ce chiffre. Ou mieux encore, au lieu de lire un entier et de le transformer manuellement en chaîne, lisez simplement l'entrée sous forme de chaîne. Veuillez également publier votre fonctionprincipale.vous pouvez créer une sortie int [11] au lieu de la sortie char [11], ou faire comme le commentaire ci-dessus mais changer le printf de% d à% c
La
sortie [11]semble petite. Que diriez-vous de 983-49552-072886-117309-5773 ?"quand j'essaye de l'imprimer, j'obtiens une sortie bizarre" -> il est plus instructif de poster la sortie exacte reçue plutôt que de la décrire seulement.