2015-02-12 3 views
1
int main() { 
    char str1[21]; 
    char str2[21]; 
    char l_str1[21]; 
    char l_str2[21]; 

    printf("Please enter the first word: "); 
    scanf("%s", str1); 
    printf("Please enter the second word: "); 
    scanf("%s", str2); 

    Lowercase_Strings(str1, l_str1); 
    Lowercase_Strings(str2, l_str2); 

    printf("Lowercase string 1: %s", l_str1); 
    printf("Lowercase string 2: %s", l_str2); 

// Converts original strings to lower case, keeping original string unchanged 
void Lowercase_Strings(char str[21], char l_str[21]) { 
    char c; 
    int i; 

    for(i = 0; i < strlen(str); ++i) { 
     c = str[i]; 
     l_str[i] = tolower(c); 
    } 
} 

Эй, ребята, девочки! Новое здесь, так что если что-то не так, как я отформатировал это, я бы не возражал против критики.Почему моя функция искажает только один из моих массивов символов?

Это фрагмент из моей программы, чтобы проверить, являются ли две строки анаграммами друг друга, без учета регистра.

Однако l_str1 массив всегда заканчивается «испорчены» каким-то образом по сравнению с l_str2 массива, независимо от порядка вызова Lowercase_Strings или строк, назначенных либо массив.

Например, str1 = "MARY" и str2 = "ARMY" приведут к l_str2 = "army", но l_str1 = "mary" с 2 случайными символами в конце.

Если у кого-то есть идея, что происходит, то это будет оценено.

+1

Вы забыли, что все строки в С, * прекращаются * по специальному символу ' '\ 0''. –

+0

Глупая ошибка, спасибо большое! – josephdt12

ответ

4

Вы не добавляете NULL CHAR к преобразованным строкам.

Добавить ниже строки в конце вашего цикла для

l_str[i] = 0x00; 

EDIT:

1.Both массива не инициализируется на любое значение.

2. printf распечатает до того, как находит нуль в массиве.

Поэтому я могу только сказать здесь, что вам повезло получить нуль в одном из ваших массивов в правильном положении и на 2 позиции позже во втором массиве. Что вы сделали в своем коде, это неопределенное поведение, и это может привести к сбою программы.

+0

doh! Спасибо огромное! – josephdt12

+1

@vagish, если вы не возражаете, есть разница между «NULL» и «null». Пожалуйста, изучите его. :-) –

1
char l_str1[21]=""; 
char l_str2[21]=""; 

Убедитесь, что ваши строки \0 завершены.

Я бы сказал

scanf("%s", str1); 

не является хорошей идеей использовать fgets() вместо этого.

size_t n; 
fgets(str1,sizeof(str1),stdin); 
n = strlen(str1) 
if(n>0 && a[n-1] == '\n') 
a[n-1] = '\0'; 
+0

Фактическая длина строки может быть меньше 21, а затем printf будет печатать случайные значения до тех пор, пока не найдет NULL CHAR. – Vagish

+0

Спасибо! В этом есть смысл! – josephdt12

+0

@ Вагиш whaaat ?? [Троллинг] (http://ideone.com/uyF7f2) Пожалуйста, проверьте несколько раз до DW – Gopi

1

strlen() не рассчитывает на окончание null. Таким образом, в функции Lowercase_Strings(), после того, как [вне] цикл for, вам нужно добавить

l_str[i] = `\0`; 

, чтобы убедиться, что l_str получает нулем.

Кроме того, вы можете ограничить размер входного сигнала с помощью

scanf("%20s", str1);  //read only 20 chars, 1 for null, total 21 
scanf("%20s", str2);  //read only 20 chars, 1 for null, total 21 
Смежные вопросы