用户字符串输入直到c中的\ 0

时间:2017-12-04 22:41:40

标签: c string printf scanf

我想简单地获取一个用户输入字符串。当人员按Enter键或字符串命中NULL字符时,将保存字符串(scanf)。然而,当我运行我的程序并输入字符串时,它继续输入,直到我输入\ n或\ 0(无论我在if语句中有哪个。这是我的代码:

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

#define MSL 30

char intersperse(char);
char widen_stars(char);

int main(int argc, char *argv[])
{
    char *p, *q, *str1[MSL], *str2[MSL];


    if(str1[MSL+1] != '\0'){    
    printf("Please enter a string of maximum 30 characters: ");
    scanf("%s\n", str1[MSL]);


    }
    printf("%s\n", str1[MSL]);

}

这绝不是完成的代码,我只是在编写我的程序的过程中,当我抓住这个烦人的bug。我的MSL上的+1是为了确保读取NULL字符,所以我的字符串不会对我大喊大叫,如果有必要,就是idk,但这是一个预防措施。谢谢你回答。

1 个答案:

答案 0 :(得分:3)

您的代码存在各种问题,而不仅仅是一个简单的错误。我会试着在这里描述一些。

打开编译器警告。例如,如果您的数组大小为30,则索引30处没有元素(索引将从0到29)。您的编译器可能已经警告过您和其他问题。

将字符串存储在char数组或指针中,但不存储在char指针数组中。当你写道:

char *str1[MSL]

您正在创建指向char或字符串数​​组的指针数组。但是,由于您正在处理指向char字符串的指针,因此您需要自己为它们分配空间。那是另一个概念。您可能打算像这样写一个char数组:

char str1[MSL]
char *p, *q, str1[MSL], str2[MSL]; /* in your declaration */

输入最多29个字符。如果您的字符串包含30个char,并且您需要1来在结尾处标记空值,那么您还有29个可用{{1} }秒。或者......将char更改为31。

请考虑从MSL格式中删除\n。它将使它读取等待下一个非空格的所有空格(这是scanf表示的格式)。因此,例如,输入\n将不会直接发送到您的程序,直到下一个非空格或EOF。

somestring<enter>一个地址。这可能只是数组名称(转换为第一个元素地址)或指针(如果您正在使用它们)。

scanf

您可以限制scanf("%s", str1); scanf("%s", strptr); /* strptr is a char pointer pointing to previously allocated space */ 读取的长度。为了安全起见:

scanf

请勿在比较中使用未初始化的数据。当您撰写scanf("%29s", str1); 时,如果您从未存储任何内容,您希望if(str1[MSL+1] != '\0')包含哪些内容?

str1