2
votes

Constantes de nouvelle ligne en C

Mon code:

#include <stdio.h>

int main() {
   const int  LENGTH = 10;
   const int  WIDTH = 5;
   const char NEWLINE ='\n';
   const char k="hjk";
   int area;

   area = LENGTH * WIDTH;
   printf("value of area : %d", area);
   printf("%c", NEWLINE);
   printf("%c", k);
   return 0;
}

Dans le code ci-dessus, la sortie:

value of area: 50

Process returned 0 (0x0)   execution time : 2.909 s
Press any key to continue.

Il y a une nouvelle ligne insérée, mais quand je change NEWLINE = "\ n" bien que sachant qu'il s'agit d'un type char, il n'y a aucune erreur demandée par le compilateur et aucune nouvelle ligne n'est imprimée. Pourquoi???

Aussi, j'ai modifié mon code comme,

#include <stdio.h>

int main() {
   const int  LENGTH = 10;
   const int  WIDTH = 5;
   const char NEWLINE ='\n';
   int area;

   area = LENGTH * WIDTH;
   printf("value of area : %d", area);
   printf("%c", NEWLINE);

   return 0;
}

La sortie est uniquement la zone calculée et la nouvelle ligne mais k n'est pas imprimée. Je trouve aussi cela très bizarre! Pouvez-vous s'il vous plaît donner des suggestions?

Soyez assez gentil avec les suggestions et signalez mes erreurs car je suis un débutant en C.


2 commentaires

Avez-vous activé tous les avertissements de votre compilateur?


'\n' est un caractère, "\n" est une constante de chaîne ....


4 Réponses :


-1
votes

L'instruction const char k="hjk"; n'est pas un code C valide. Apparemment, votre compilateur l'accepte et attribue l'adresse mémoire où la chaîne littérale "hjk" commence à k . Une adresse mémoire et un caractère sont tous deux implémentés sous forme de nombres entiers, de sorte que l'adresse mémoire est interprétée comme le code numérique d'un caractère.

Parce que k est maintenant, très probablement, un caractère non imprimable, printf("%c", k); n'imprimera rien.

Exactement la même chose se produit lorsque vous faites const char NEWLINE ='\n'; .


4 commentaires

Il y a une conversion de pointeur en caractère, pas d'entier.


Oui, mais cela n'a pas de sens de convertir un pointeur en caractère. La raison pour laquelle un pointeur est converti en caractère est qu'un pointeur est, par essence, un nombre entier et il est logique de convertir un entier en caractère, car chaque caractère est représenté par un nombre entier en mémoire. Pour rendre cela clair, j'ai mentionné «entier» dans ma réponse.


Non, l'instruction const char k="hjk"; entraîne un diagnostic du compilateur pour l'écriture de code C non valide.


@Lundin, merci, j'ai édité ma réponse et j'ai donné votre réponse +1.



0
votes

k semble un tableau de char. Essayez d'utiliser:

const char k[] = "something";
printf("%s", k);


0 commentaires

2
votes

Le problème est que vous essayez d'enregistrer une string en tant que char , vous devez changer const char k = "hjk" à const char k[]="hjk" et l' imprimer en utilisant %s au lieu de %c .

#include<stdio.h>
int main() {
  const int  LENGTH = 10;
  const int  WIDTH = 5;
  const char NEWLINE ='\n';
  const char k[]="hjk";
  int area;

  area = LENGTH * WIDTH;
  printf("value of area : %d", area);
  printf("%c", NEWLINE);
  printf("%s", k);
  return 0;
}

Quelques précisions: si vous enregistrez une " string " sans spécifier qu'il s'agit d'un tableau de caractères char[] , si vous essayez de l'imprimer sous forme de caractère %c un avertissement serait générateur ( warning: incompatible pointer to integer conversion initializing 'const char' with an expression of type 'char [4]' ) et si vous essayez de l'imprimer sous forme de tableau de caractères %s ( string ), vous allez recevoir une segmentation fault .


3 commentaires

Le code n'est pas valide C et n'a pas de comportement déterministe. Un compilateur étrange a quand même craché un binaire étrange, mais ce que celui-ci fera est de deviner. Que doit faire un compilateur C lorsqu'il trouve une erreur?


@Lundin pourrais-tu expliquer un peu mieux? je ne sais pas à quoi vous faites référence spécifiquement (ou si je voulais corriger ma réponse serait encore mieux)


J'ai posté une réponse maintenant. stackoverflow.com/a/64820204/584518



2
votes

quand je change NEWLINE = "\ n" bien que je sache qu'il s'agit d'un type char, il n'y a pas d'erreur demandée par le compilateur

const char NEWLINE = "\n"; n'est pas valide C. La raison pour laquelle il est invalide est expliquée en détail ici: "Pointeur d'un entier / entier d'un pointeur sans conversion"

Le compilateur n'est pas obligé de produire une "erreur", mais il est nécessaire de produire une sorte de message de diagnostic. Voir Que doit faire un compilateur C lorsqu'il trouve une erreur?

Pourquoi votre compilateur a décidé de cracher un binaire malgré le fait qu'il soit alimenté par un C invalide est une hypothèse. Vous devez demander aux personnes qui ont créé le compilateur. Dans le cas de gcc, vous ne trouverez pas de réponse, car il s'agit d'un comportement complètement non documenté.

Et par conséquent, toute sortie que vous obtenez d'un tel programme "non C" est également complètement non déterministe, à moins qu'un compilateur ait documenté le comportement parmi les extensions de compilateur non standard. gcc ne l'a pas fait.

De même, const char k="hjk"; est également invalide C.


2 commentaires

Eh bien, il y a une différence entre enregistrer "\n" et '\n' comme cela est fait dans la question


@LorenzoZane Ouais ben je ne vais pas expliquer pourquoi '\n' fonctionne ...