2014-12-01 2 views
-3

У меня есть программа, которая принимает массив символов и вызывает функцию convert. Функция определяет, является ли символ буквой или номером. Предполагается, что программа выводит первую букву, которую она находит в строке. и первые числа, которые он находит в строке. Моя петля, чтобы перестать искать буквы после того, как находит ее, не работает.Петля с простым счетчиком неисправна?

Любые мысли? Код написан на C с использованием компилятора Borland.

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 

int convert (char array[],char **); 

int main() 
{ 
    int intval; 
    char array[512], *charptr; 

    printf("Input a string that starts with a series of decimal digits:\n>"); 
    while (gets(array) != NULL){ 
     intval = convert(array, &charptr); 
     printf ("Intval contains %d, Charptr contains '%s'\n", intval, charptr); 
    } 
    system("pause"); 

    return 0; 


} 
int convert (char array[],char ** charptr) 
{ 
    int i, x, c = 0; 
    char b[512]; 
    for (i=0;i<strlen(array);i++){ 

     if (isalpha(array[i])) 
     { 
      if(c >= 1){ 
       *charptr = &array[i]; 
       c++; 
       } 
      else 
       break; 


     } 
     else if (isdigit(array[i])) 
       x = 10*x + array[i] - '0'; 

    } 

    return x; 
} 

UPDATE:

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 


int convert (char array[],char ** charptr); 



int main() 
{ 
    int intval; 
    char array[512], *charptr; 

    printf("Input a string that starts with a series of decimal digits:\n>"); 
    while (gets(array) != NULL){ 
     intval = convert(array, &charptr); 
     printf ("Intval contains %d, Charptr contains '%s'\n", intval, charptr); 
    } 
    system("pause"); 

    return 0; 


} 
int convert (char array[],char ** charptr) 
{ 
    int i, x, c; 
    char b[512]; 
    for (i=0;array[i] != 0;i++){ 
     if (isdigit(array[i])) 

       x = 10*x + array[i] - '0'; 
     else if (isalpha(array[i])) 
     { 
      c++; 
      if(c >= 1){ 
       *charptr = &array[i]; 

      } 
     } 

    } 

    return x; 
} 
+1

Вы прошли через код с помощью отладчика? – pm100

+0

Подсказка: 'if (c> = 1) {' никогда не является истиной. – chux

+0

1. charptr должен быть выделен перед использованием 2. Это плохо: for (i = 0; i AlexanderVX

ответ

0

У вас есть логическая ошибка. c инициализируется до 0. Существует строка для увеличения c, но она находится внутри блока if, который никогда не будет правдой.

 if(c >= 1){ 
      *charptr = &array[i]; 
      c++; 
      } 

Поймать 22 ???

Возможно, вы имели в виду использовать:

int convert (char array[],char ** charptr) 
{ 
    int i, x, c = 0; 
    char b[512]; 
    for (i=0;i<strlen(array);i++){ 

     if (isalpha(array[i])) 
     { 
       // No need for checking the value of c 
       // return as soon you find an alphabet. 
       *charptr = &array[i]; 
       break;  
     } 
     else if (isdigit(array[i])) 
       // If you are looking for an alphabet only, 
       // why do you have this block of code??? 
       x = 10*x + array[i] - '0'; 
    } 

    return x; 
} 

Update

Может быть, это то, что вы ищете.

int convert (char array[], char ** charptr) 
{ 
    size_t i; 
    int x = 0; 
    size_t len = strlen(array); 

    // Set charptr to NULL in case there are no letters in the input. 
    *charptr = NULL; 
    for (i=0;i<len;i++){ 

     if (isalpha(array[i])) 
     { 
     *charptr = &array[i]; 
     return x; 
     } 
     else if (isdigit(array[i])) 
     { 
     x = 10*x + array[i] - '0'; 
     } 
    } 

    return x; 
} 
+0

@R Sahu Мне нужен второй блок кода для печати первых найденных номеров. Например, пользователь вводит 274ADAMS. Он будет печатать первые 3 числа, а затем первую букву «A». – Himinguiand1930

+0

@ R Sahu сделал для вас эту работу? Я попытался использовать этот код, и он по-прежнему не останавливается после первой буквы. – Himinguiand1930

+0

Он остановится после того, как найдет письмо И число. Если вы хотите остановиться после первой буквы, независимо от того, вы нашли номер или нет, эту функцию нужно изменить. –

0
int scanString(char array[],char * charptr) 
{ 
    int len = strlen(array); 
    int digs = 0; 
    int x = 0; 
    *charptr = 0; 
    for (int i=0;i<len;i++){ 

     if (charptr == 0 && isalpha(array[i])) 
     { 
       *charptr = array[i]; 
     } 
     else if (digs == 0 && isdigit(array[i])){ 

       x = array[i] - '0'; 
       digs = 1; 
     } 
     if(digs > 0 && charptr != 0) 
      break; 
    } 

    return x; 
} 

спецификация говорит вернуть первый символ найден так изменил charptr.

+0

, в начале нужно установить 'x' и '* charptr', чтобы указать связанный элемент, который не найден в строке. Поэтому, если он не находится в строке, вызывающий абонент узнает, что элемент не найден. если бы я это делал, я бы перечислил для 4 возможных условий возврата, передал в другой ptr цифру и, соответственно, выполнил – user3629249

+0

- я думаю, поэтому он умножил на 10 - отличить найденный и 0 = не найден – pm100

Смежные вопросы