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
声明为charStudentName[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)
<代码>:)