C 正在扫描字符串,直到出现“0”:&引用;

C 正在扫描字符串,直到出现“0”:&引用;,c,while-loop,scanf,C,While Loop,Scanf,我正在编写一个代码,我希望它扫描一个名称,直到它到达“:”,但不知怎的,它一直在扫描“:”。 这是我的密码: char letter, StudentName[1][40]; int j=0; scanf("%c", &letter); while (letter != ":") { StudentName[1][j] = letter; j++; scanf("%c", &letter); } 此外,尽管代码运行,但我收到一条警告消息:“警告C4047:'!=':'int'在

我正在编写一个代码,我希望它扫描一个名称,直到它到达“:”,但不知怎的,它一直在扫描“:”。 这是我的密码:

char letter, StudentName[1][40];
int j=0;
scanf("%c", &letter);
while (letter != ":")
{
StudentName[1][j] = letter;
j++;
scanf("%c", &letter);
}

此外,尽管代码运行,但我收到一条警告消息:“警告C4047:'!=':'int'在间接寻址级别上与'char[2]不同”

您在while循环条件下执行字符串比较,而不是字符比较

你本质上问的是((char*)字母==(char*)“字符串”)

两件事:

第一,这不是进行字符串比较的方式。(见:)

第二,你甚至不想做字符串比较,你想做字符比较,所以把双引号改成单引号

此外,您的字符串甚至不在堆栈上,它位于只读部分,因为它是在编译时分配的-因此,任何堆栈/堆分配的指针都不会是相同的:)

另外,当您分配一个具有N索引的数组时,您可以访问的最大索引(而不冒访问冲突/分段错误的风险)是N-1,因此在您的示例中,我将更改行:

StudentName[1][j] = letter;


此外,为了健壮性,考虑在用户可以插入的输入量上加上一个上限(即,另一个条件来限制一个不超过SIZEF(学生姓名)字符的限制)。不需要变量字母。或者,如果要使用变量字母,只需将字符“:”赋给字母,并将其与StudentName值进行比较

int i,j;
for(i=0;i<2;i++){
for(j=0;j<40;j++){
if(StudentName[i][j]==':')}break;
scanf("%c", &StudentName[i][j]);} 
inti,j;

对于(i=0;i没有理由将
StudentName
声明为char
StudentName[1][40]
。只需将数组声明为:

char StudentName[40] = {0};
请注意,数组也被初始化为包含所有
0
。这是一个好习惯。初始化所有变量是一个好做法,有很多原因。在这里,通过初始化为
0
可以填充字符数组(可能用作字符串)使用nul终止字符,因此如果无法显式终止字符串,则可以通过初始化来完成

接下来,在进行字符输入时(一次输入一个字符),您通常希望使用
getchar
fgetc
,以避免使用
scanf
系列函数时固有的许多缺陷。下面显示了一个使用“getchar”的简单实现:

#include <stdio.h>

int main (void) {

    char StudentName[40] = {0}; /* char array   */
    int letter = 0;             /* int value    */
    size_t idx = 0;             /* array index  */

    printf ("\nEnter StudentName (until ':'): ");   /* always prompt */

    /* read input until ':' (or end-of-line or end-of-input) */
    while ((letter = getchar()) != ':' && letter != '\n' && letter != EOF) {
        StudentName[idx++] = letter;

        if (idx + 1 == 40) break;  /* prevent writing beyond array */
    }

    StudentName[idx] = 0;   /* nul-terminate string */

    printf ("\nYou entered: %s\n\n", StudentName);

    return 0;
}
编译

gcc -Wall -Wextra -O3 -o bin/studentname studentname.c
$ ./bin/studentname

Enter StudentName (until ':'): John Q. Smith:Age 21:Weight 180

You entered: John Q. Smith
(将
-O3
优化替换为
-g
,以使用
gcc
生成调试符号)

示例使用

gcc -Wall -Wextra -O3 -o bin/studentname studentname.c
$ ./bin/studentname

Enter StudentName (until ':'): John Q. Smith:Age 21:Weight 180

You entered: John Q. Smith
或将输入重定向到程序:

$ printf "John Q. Smith:Age 21:Weight 180\n" | ./bin/studentname2

Enter StudentName (until ':'):
You entered: John Q. Smith
注意:这只是一个nit,但如果您计划接受用户输入,请提示用户。否则,用户会看着闪烁的光标,怀疑程序是否挂起。显然,在读取文件时不会,但在请求输入时,请提示


如果您有任何进一步的问题,请告诉我。

更改
StudentName[1][j]=字母;
-->
StudentName[0][j]=字母;注意:在循环之后,添加
StudentName[0][j]='\0';
。如果只有1个
StudentName
,那么为什么要将其设置为二维数组?chux-我为什么要添加'\0'?它不是自动添加的吗?不,在您的代码中,
'\0'
不会自动或显式地添加到任何地方。您认为是什么代码自动添加的?在注释中用@前缀名称,否则在“@chux”与“chux”中,用户没有收到通知,这会导致很多事情失败:1)
for(i=0;i<2;i++)。。中断。
对于循环是不必要的
,2)不允许
scanf(“%c”,&StudentName[i][j])将被调用。3) 
{if(StudentName[i][j]=':')}
是一个语法错误4)
scanf()
结果未测试。很多好主意!小调:
idx+1==40
-->
idx+1==sizeof(StudentName)
你把我带到了那里,但是
40
是为了加强
StudentName[40]
的相关性,但是
sizeof(StudentName)
会更易于维护。如果我有我的druthers,我们会有
#define MAXC 40
char StudentName[MAXC]={0}
sizeof(StudentName)
<代码>:)