我正在研究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] = '#';
}
}
答案 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个终结符)。
此外,该函数应该返回结果,而不是打印它(根据练习)。