2015-10-05 2 views
-1

У меня есть этот код в C, но я не знаю, почему я получаю сообщение об ошибке, как Argument of type “char” is incompatible with parameter of type const char*Объединить строку с ошибкой

char number_string[size] = { NULL };     
    int counter = 0;          

    for (counter = 0; counter < strlen(input_string - 1); counter++) 
    { 
     temp = input_string[counter];     

     if (isdigit(temp)) 
     { 
      strcat(number_string, temp); //temp variable has the error only in this line 
     } 
    } 
+1

'символ number_string [размер] = {NULL}; 'не является допустимым объявлением. Это должно быть либо 'char * number_string = NULL;', либо 'char number_string [size] =" mytext "; '. Для чего это? Если вы хотите получить пустую строку, например, 'char number_string [size] =" ";' –

+0

@WeatherVane благодарит. Но темп все еще имеет ошибку. –

+0

@RigelKentCarbonel Как объявляется 'temp'? – ameyCU

ответ

3

Вы смешивания char и char *. Объявление number_string[] может не предупредить вас, потому что NULL может просто быть определено как 0, что является законным как символ и как указатель. Но переменная temp определенно является проблемой: вы не показываете ее декларацию, но ее первое назначение делает ее char, а ее второе использование в strcat предполагает, что это char *.

Если вы хотите добавить один символ за один раз в строку, вам придется сделать это вручную, что-то вроде этого:

int nslen = strlen(number_string); 

for ... 
    number_string[nslen++] = temp 

number_string[nslen] = '\0'; 
+0

На самом деле сэр я объявил, что мой temp как 'char'. Любое решение для хранения 'temp'' to_ number_string [] '? –

+1

'strcpy (number_string, input_string);' –

+0

Он только хочет добавить персонажа за раз в 'number_string' ... вам просто нужно сделать это вручную. Я бы создал переменную 'nl = 0' в начале, затем там, где вы хотите добавить' temp', do 'number_string [nl ++] = temp'. В конце сделайте 'number_string [nl] = '\ 0''. –

2

char *strcat(char *dest, const char *src); ожидает, что последний аргумент иметь тип const char *

temp является переменной типа char.

Таким образом, вы получаете сообщение об ошибке Argument of type “char” is incompatible with parameter of type const char*.

Вы могли бы попробовать что-то вроде этого ...

strncat(number_string, &temp, 1)

Я обычно благоприятствуют что-то вроде ...

sprintf (buffer, "%s%c", number_string, temp)

+0

Все это обсуждение, конечно, игнорирует (болезненную) проблему переполнения буфера. – QuestionC

+1

Я боюсь, что ваш исходный оператор неверен: только второй аргумент 'strcat' имеет тип' const char * '...' snprintf' гораздо предпочтительнее, чем 'sprintf', чтобы избежать переполнения буфера. Ваше использование 'strncat' является сверхъестественным, но не ошибочным! – chqrlie

+0

Исправлено, спасибо .. – QuestionC

1

Это не ответ на проблемы с типами; это предложение решить проблему по-другому.

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

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

В таких случаях, как ваш, обычно легче решить проблему на низком уровне, где вы сами создаете массив символов, по одному символу за раз. Например, вы можете перебирать входную строку с i и скопировать все цифры в строку чисел с помощью второго индекса, j:

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

int main() 
{ 
    size_t size = 12; 
    char number[size]; 

    const char *input = "Alpha 123/Bravo 456/Charlie 789/Delta 007"; 
    int i, j; 

    j = 0; 
    for (i = 0; input[i] != '\0'; i++) { 
     if (isdigit((unsigned char) input[i]) && j + 1 < size) { 
      number[j++] = input[i]; 
     } 
    } 

    number[j] = '\0'; 
    puts(number); 

    return 0;  
} 

Обратите внимание, как код отслеживающих символов в строке чисел и как это делается, чтобы не переполнять буфер. Строка номера может быть усечена, но она всегда будет заканчиваться нулем.

Я также использовал input[i] != '\0' для обнаружения конца строки (которая, по определению, нуль-терминатор '\0') вместо вызова strlen(input), который всегда начинает искать терминатор Фро в начале строки.

+0

Только два небольших вопроса: 'input' должен быть' const char * 'и' isdigit (input [i]) 'должен быть' isdigit ((unsigned char) input [i]) ' – chqrlie

+0

Да, это знаковая проблема' ... макросы всегда меня задевают. Приведение должно действительно быть частью макроса. –

+0

Невозможно, поскольку макрос принимает EOF в качестве действительного аргумента. Реальное решение этой проблемы заключается в том, что по умолчанию используется 'char' unsigned. По умолчанию обычный компилятор считает, что 'char', подписанный по умолчанию, создает несоответствия в языке и стандартной библиотеке. Попробуйте следующее: 'if ('\ 200'! = L '\ 200') printf (« подписанный символ имеет удивительную сторону effecst! \ N ");' – chqrlie

0

Есть несколько проблем в вашем коде:

  • призывающих strlen(input_string - 1) скорее всего, вызывает неопределенное поведение. Вероятно, вы имели в виду strlen(input_string) - 1, который все равно заставил бы цикл работать слишком далеко, если input_string - пустая строка;
  • вызов strlen для каждой итерации в любом случае неэффективен;
  • неправильный адрес isdigit(temp), если temp является char и char подписан по умолчанию;
  • strcat не может быть использован так, как вы его называете;
  • вы должны проверить возможное переполнение буфера, если все цифры не подходят в целевом массиве.

Вот гораздо проще функция, чтобы извлечь все цифры от input_string:

char number_string[size]; 
int i, j; 

for (i = j = 0; input_string[i] != '\0'; i++) { 
    unsigned char uc = input_string[i]; 
    if (j < size - 1 && isdigit(uc)) { 
     number_string[j++] = uc; 
    } 
} 
number_string[j] = '\0';    
Смежные вопросы