2015-03-16 2 views
-4
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char a[10],b[10]; 
    int i,j,n=0,m=0; 

    scanf("%s %s",a,b); 

    for(i=0;i<strlen(a);i++) 
     n+=a[i]; 

    for(i=0;i<=strlen(b);i++) 
     m+=a[i]; 

    printf("%d",n*m); 

    return 0; 
} 

вход 123 45 означает выход 54 (который вступил в силу (1 + 2 + 3) * (4 + 5)), но это не HELPо сравнении между подписью и целого числа без знака выражения

На строках 8 и 9 показано сравнение между целыми выражениями с подписью и без знака, и я получаю неправильный айнсер

Ввод 123 45 означает выход 54 (который поступает от (1 + 2 + 3) * (4 + 5)) , но это не HELP

+1

Символ '1' не совпадает с номером 1. Вы добавляете ASCII. –

+1

1) это C, а не C++; 2) пожалуйста, отформатируйте свой код, особенно когда вы говорите о номерах строк (но не только); 3) посмотреть, что такое ASCII-код; 4) не совсем понятно, что вы просите –

+0

Чтобы решить проблему в названии темы, вам придется изменить переменные 'int' на' size_t', что является типом, который возвращает 'strlen'. –

ответ

2

Вместо этих двух петель

for(i=0;i<strlen(a);i++) n+=a[i]; 
for(i=0;i<=strlen(b);i++) m+=a[i]; 
     ^^     ^^^^ 

написать

for (i = 0; a[i] != '\0'; i++) n += a[i] - '0'; 
for (i = 0; b[i] != '\0'; i++) m += b[i] - '0'; 

Примите во внимание, что функция зсапЕ небезопасно при использовании с символьными строками. Также вы должны проверить, является ли следующий символ цифрой, например, с использованием стандартной функции C isdigit.

Что касается сообщения компилятора, то функция strlen имеет тип возврата size_t, который представляет собой неподписанный интегральный тип. Вы сравниваете значение, возвращаемое strlen с переменной i, которую вы указали как имеющую тип signed int. Поэтому компилятор предупреждает, что результатом сравнения может быть не то, что вы ожидаете, потому что переменная i будет преобразована в значение r size_t

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