C字符串比较不允许空格键

时间:2017-02-13 16:10:29

标签: c string-comparison

使用cprogrammingsimplified教程编写自己的stringcompare。 完成后重新格式化并运行它。 适用于单个单词,

但是

键入空格键会跳过第二次扫描并立即输出 '单词不是相同的'

任何人都知道如何允许使用一个空格键?

提前致谢。

#include <stdio.h>

int mystrcmp(char s1[], char s2[]);

int main(){
    char s1[10], s2[10];
    int flag;

    printf("Type a string of 10\n\n");
    scanf("%s",&s1);
    printf("type another string of 10 to compare\n\n");
    scanf("%s",&s2);

    flag = mystrcmp(s1,s2);

    if(flag==0)
        printf("the words are the same\n\n");

    else
        printf("the words are not the same\n\n");

    return 0;
}

int mystrcmp(char s1[], char s2[]){
    int l=0;

    while (s1[l] == s2[l]) {
        if (s1[l] == '\0' || s2[l] == '\0')
            break;
        l++;
    }

    if (s1[l] == '\0' && s2[l] == '\0')
        return 0;
    else
        return -1;
}

4 个答案:

答案 0 :(得分:3)

使用fgets()读取实线,而不是scanf()来读取以空格分隔的单词。

请记住,fgets()会在字符串中包含换行符。

答案 1 :(得分:3)

strcmp不允许空格键,scanf格式说明符%s。输入在空格处被截断,因此您读取的第二个字符串实际上是第一个字符串的延续。

您可以在格式说明符中使用%9[^\n]代替%s来解决此问题:

printf("Type a string of 10\n\n");
scanf("%9[^\n]",s1); //s1 is char [10]
printf("type another string of 10 to compare\n\n");
scanf("%9[^\n]",s2); //s2 is char [10]

9将输入限制为九个字符,因为您使用的是十个字符的缓冲区。

答案 2 :(得分:2)

很多答案告诉你scanf("%s",s1)只能逐字逐句地阅读。这是因为默认情况下scanf("%s",s1)由所有空格分隔,其中包括\t\n<space>或您能想到的任何其他空格。

scanf("%[^\n]s",s1)做的是将分隔符设置为\n。所以实际上读取所有其他空格。

@dasablinklight还在'[^\n]'之前指定了9,这表示scanf()从输入缓冲区中获取了9个值。

IMO scanf()是一个非常好的功能,因为它的隐藏功能。我建议你在documentation中阅读更多相关信息。

答案 3 :(得分:0)

问题在于,如果您在第一行输入abc def,则第一个scanf("%s", s1)(不需要&符号 - 它应该不存在)读取abc,第二行读取{{1} }}。那些不平等。输入def,您会发现单词相同。 very very停止在空间阅读。

10号的缓冲区太小而不舒服。

修复:使用fgets()或POSIX的getline()读取行(例如%s),删除尾随换行符(可能:char s1[1024], s2[1024];是一种可靠的方法)然后继续比较一下。