una - Contando caracteres en C
programa en c++ que cuente las letras de una palabra (4)
En lugar de usar scanf, intente fgets así:
char input[256];
fgets(input, sizeof(input), stdin);
fgets leerá una línea completa de un archivo. Como tal, pasar stdin como manejador de archivo hará que se lea desde la entrada estándar, que en la mayoría de los casos se vinculará a la consola. Una cosa a tener en cuenta, sin embargo, es que la secuencia que obtienes de fgets podría incluir el carácter de nueva línea. En lugar de verificar explícitamente sus cadenas de desigualdad con el carácter de espacio (''''), sugiero usar la función isspace de ctype.h, que verificará varias formas de espacios en blanco (incluyendo un espacio regular y una nueva línea).
Aquí hay un ejemplo completo y ejecutable:
#include <stdio.h>
#include <ctype.h>
int count_nonspace(const char* str)
{
int count = 0;
while(*str)
{
if(!isspace(*str++))
count++;
}
return count;
}
int main()
{
char input[256];
fgets(input, sizeof(input), stdin);
printf("%d/n", count_nonspace(input));
}
Intento escribir un programa que cuente a todos los personajes en una cadena. Originalmente lo tenía, pero luego me di cuenta de que no puedo contar espacios. No puedo ver por qué esto no funciona.
for(m=0; z[m] != 0; m++) {
if(z[m] != '' '') {
charcount ++;
}
}
Cualquier asistencia apreciada.
Editar * ¿Hay alguna diferencia si la entrada (cadenas) se está escaneando así? Y sí, todo está inicializado. Intenté imprimir lo que z [m] evalúa también y no es el valor real de la cadena en "m", creo que este es el problema.
for(j=0; j<7; j++){
printf("Enter a string:/n");
scanf("%s", z);
for(m=0; z[m] != 0; m++){
if(z[m] != '' ''){
charcount ++;
}
}
Necesita inicializar charcount
. Aparte de eso, debería funcionar, siempre que z
sea una matriz de caracteres con terminación cero m
sea un int
o similar. Probablemente escribiría simplemente z[m]
lugar de z[m] != 0
(ya que! 0 = verdadero y 0 = falso), pero ambos funcionan. Hay formas más eficientes de hacerlo (aunque en estos días apuesto a que un compilador se encargará de convertir esto en un bucle basado en un puntero).
Aquí hay un ejemplo completo y correcto con ediciones mínimas:
const char * z = "testing one two three";
int m;
int charcount;
charcount = 0;
for(m=0; z[m]; m++) {
if(z[m] != '' '') {
charcount ++;
}
}
Si está utilizando una clase String
de algún tipo en lugar de una matriz C null terminada a la antigua, querrá consultar esa clase para saber cómo recorrerla.
Todo lo anterior también supone que está tratando con cadenas ASCII. Si se trata de cadenas codificadas en UTF, debe manejar caracteres multibyte.
Re su edición: hace una gran diferencia: scanf
se detendrá en el primer espacio en blanco (lo había olvidado). Sin embargo, podría hacer una diferencia aún mayor que eso, si no declaras z
correctamente. (También recomendaría usar un ancho de campo cuando use scanf
para leer cadenas [o evitar scanf
completo]; de lo contrario, no tiene control sobre el número de caracteres que intentará almacenar, y así, en teoría , nunca se almacenará ningún búfer lo suficientemente grande como para evitar un desbordamiento. Más aquí: http://www.crasseux.com/books/ctutorial/String-overflows-with-scanf.html )
Sí, hay una diferencia en el escaneo de entrada con scanf:
scanf("%s", z);
...
if(z[m] != '' ''){
scanf ("% s" ...) siempre se rompe en el espacio-carácter, por lo tanto, si alguna vez es verdad . Es mejor que uses los fgets para leer de stdin,
#define MAXINPUT 80
char line[MAXINPUT];
for(j=0; j<7; j++) {
printf("Enter a string:/n");
if( fgets( line, 80, stdin ) )
{
char *c=line;
if( strchr(line,''/n'') ) *strchr(line,''/n'')=0;
while( *c )
{
if( *c!='' '' )
++charcount;
++c;
}
}
}
O si quieres espacios en blanco, entonces toma
#include <ctype.h>
...
if( !isspace(*c) )
Puedes usar strlen()
Sugeriría usar un ciclo while y usar nombres de variables más significativos
m = textIndex
z = text
Algo como esto funcionaría
while (text[textIndex] != 0x00)
{
textIndex++;
}