c编程输入最后一个元素是@

时间:2015-09-26 15:41:47

标签: c arrays input

我正在研究Brian W. Kernighan(作者),Dennis M. Ritchie(作者)关于练习2-5的书中的c语言:

  

写函数any(s1,s2),它返回字符串s1中的第一个位置   发生字符串s2中的任何字符,如果s1不包含s2中的字符,则返回-1。   (标准库函数strpbrk执行相同的工作但返回指向   位置。)

我有这个问题输入的最后一个元素是' @'这是我的代码:

#include <stdio.h>

void chloc(char s1[], char s2[]);

main(void)
{
    int c, i, j;
    char s1[20], s2[20];
    i = j = 0;
    while((c = getchar()) != '\n')
        s1[i++] = c;
    while((c = getchar()) != '\n')
        s2[j++] = c;

    chloc(s1, s2);

    return 0;

}

void chloc(char s1[], char s2[]){

    int i, j, b, k;
    i = 0;
    j = 0;
    for( i = 0; s1[i] != '\0'; i++)
        for(j = 0; s2[j] != '\0'; j++)
            if(s1[i] == s2[j]){
                printf("First uccurance of %d is %d\n", s1[i], i);
                s2[j] = '#';
            }


}

1 个答案:

答案 0 :(得分:1)

您的输入代码没有'\0' - 终止您的char数组,因此它们不是有效的字符串(所有字符串都由'\0'终止)。这就是为什么你的字符串处理函数访问结尾的元素,阅读垃圾。

你可以这样解决:

while((c = getchar()) != '\n')
    s1[i++] = c;
s1[i] = '\0';
while((c = getchar()) != '\n')
    s2[j++] = c;
s2[j] = '\0';

但是你应该确保你也不会读取比数组可以存储的更多的字符(19个字符+ 1个终结符)。

此外,该函数应该返回结果,而不是打印它(根据练习)。