如果在 c 中使用 scanf() 读取限制,为什么不能访问第一个字符串元素

Why can't the first string element be accessed if a limit is read using scanf() in c

int main(){
    char str[10][50],temp[50];
    int lim,i,j;
    printf("Enter lim: ");
    scanf("%d",&lim);
    for(i=0;i<lim;++i){
        printf("Enter string[%d]: ",i+1);
        gets(str[i]);
    }

这里的str[0](Enter string[1]: )无法读取。读数从'Enter string[2]: '(str[1]).

开始

但是如果不是 lim,而是一个整数传递给循环,如下所示,程序将正确执行。这种情况可能是什么原因?

int main(){
    char str[10][50],temp[50];
    int lim,i,j;
    for(i=0;i<5;++i){
        printf("Enter string: ");
        gets(str[i]);

    }

您的 scanf() 号码在输入流中留下了一个换行符,它将提供给第一个 gets()

查看此处寻求帮助:
http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html

此外,您不想再使用 gets()
Why is the gets function so dangerous that it should not be used?

首先不要使用gets(),而是使用fgets()。来自 gets()

的手册页

Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and because gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used to break computer security. Use fgets() instead.

其次 stdin 是行缓冲的,当你像 scanf("%d",&lim); 一样使用 scanf() 并按 ENTER 时,换行符 \n 字符被留在 stdin 导致 gets() 无法读取 str[0].

的流

例如

for(i=0;i<lim;++i){

       printf("Enter string[%d]:\n ",i);    

       fgets(str[i],sizeof(str[i]),stdin);

}

另请注意,当您使用 fgets() 时,它会在最后将 \n 存储到缓冲区中。如果您不想在 str[index] 末尾添加 \n,则必须将其删除。

另外不要忘记检查 fgets() 的 return 值。

例如

char *ptr = NULL;

ptr=fgets(str[i],sizeof(str[i]),stdin);

 if( ptr != NULL && str[strlen(str[i])-1] == '\n'){

         str[strlen(str[i])-1] = '[=11=]'; /* replace \n with [=11=] */

}