C中的For循环随机中断

tkqqtvp1  于 2023-02-11  发布在  其他
关注(0)|答案(2)|浏览(146)

我在C语言中已经纠结这个循环有一段时间了。我试图通过一个for循环创建一个字符串数组(我不确定我做得对不对。我希望我做得对)。每次我输入一个带有空格的字符串,for循环就会中断并跳过所有迭代。例如,如果我在命令行中写入S 1,它就会中断。
这是密码:

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

int main(){
    int players;
    int jerseys;
    int count = 0;
    int i;
    scanf("%d", &jerseys);
    
    scanf("%d", &players);
    
    char size[jerseys], p[players][100];

    for(jerseys; jerseys > 0; jerseys--){
        
        scanf(" %c", &size[count]); 
        count++;
    }
    getchar();
    count = 0;
    for(players; players>0; players--){
        /*scanf(" %s", p[0] );  */  /*you cant assign arrays in C.*/
        getchar();
        fgets(p[count], 100, stdin);
        printf("%s", p[count]);
        printf("%s", p[count][2]);  /* LINE 29 */
        printf("Hello\n");
        count ++;
    }       

    return 0;
}

而且,在第29行,如果我把索引从2改为1,循环就会立即中断,无论我放入什么。
我有一个python代码,它基本上满足了我从C语言中得到的东西:

given = []
jerseys = int(input())
if jerseys == 0:
    print(0)
players = int(input())
j = []
requests = 0
for _ in range(jerseys):
    size = input()
    j.append(size)
for _ in range(players):
     p = input().split()

我看了很多地方,我认为问题出在数组上,而不是新的行,但我没有线索。
编辑:
这看起来像是我想要输入的东西(也是我通常尝试输入的东西):

3
3
S
M
L
S 1
S 3
L 2
z9smfwbn

z9smfwbn1#

如果输入字符与控制字符不匹配,或者对于格式化输入来说是错误的类型,则scanf终止,将出错的字符作为下一个要读取的字符。
如果你在命令行中写 1 ',那么jerseys被设置为1,但是players是一个随机的int,因为 ' 不匹配 %d 格式,所以在你的程序中,你的players变量可能是一个大的int。
因此,当您使用scanf时,最好检查返回值,如

if ((scanf("%d", &players) != 1) {
    /* error handle */
}

我运行代码,segmentation fault是raise。

dwthyt8l

dwthyt8l2#

发布的代码没有干净地编译!
下面是gcc编译器的输出:

gcc -ggdb3 -Wall -Wextra -Wconversion -pedantic -std=gnu11 -c "untitled.c" -o "untitled.o"

untitled.c: In function ‘main’:
untitled.c:17:5: warning: statement with no effect [-Wunused-value]
   17 |     for(jerseys; jerseys > 0; jerseys--){
      |     ^~~
      
untitled.c:24:5: warning: statement with no effect [-Wunused-value]
   24 |     for(players; players>0; players--){
      |     ^~~
      
untitled.c:29:18: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
   29 |         printf("%s", p[count][2]);  /* LINE 29 */
      |                 ~^   ~~~~~~~~~~~
      |                  |           |
      |                  char *      int
      |                 %d
      
untitled.c:10:9: warning: unused variable ‘i’ [-Wunused-variable]
   10 |     int i;
      |         ^
      
Compilation finished successfully.

请更正代码并检查从C库I/O函数返回的状态
关于:

Compilation finished successfully.

因为编译器输出了几个警告,所以这个语句仅仅意味着编译器对你的意思做了一些猜测(不一定是正确的)。

相关问题