簡體   English   中英

在C中打印數組的值

[英]Printing values of array in C

我在打印數組內容時遇到問題。 每次我要打印它們時,都會遇到分割錯誤(請查看注釋的代碼)。 這是為什么?

#include <stdio.h>
int main(int argc, char* argv[])
{
    char const* const fileName = argv[1];
    FILE* file = fopen(fileName, "r");
    char line[256];
    char str1[10], str3[10];
    int str2[10], str4[10];
    while (fgets(line, sizeof(line), file)) {
        printf("The Full Line is: %s", line);
        sscanf(line,"%s -> %s", str1,str3);
        printf("First is: %s \n", str1);
        printf("Thirs is : %s\n", str3);
    }
    fclose(file);
//    printf("%s", str1[0]);
//   for (int i=0; i<4; i++){
//       printf("This is it!!! %s ", str1[i]);
//    }
    return 0;
}

輸入文本文件包含:

main+0x20 -> main+0x10
function1 -> function2+0x20
function2+0x34 -> function3

或更復雜的一個:

Function2+0x22 -> main+0x92
main -> main+0x22
Function2 -> vuln+0x12
main+0x86 -> Function1
main+0x86 -> main+0x92
Function1+0x12 -> Function2+0x22
func1+0x10 -> main+0x76
dummya -> func1+0x10
main+0x6a -> main+0x76
main+0x6a -> func1
main+0x76 -> main+0x86
main+0x22 -> main+0x3a
main+0xa2 -> main+0xae
func1 -> dummya
func1 -> func1+0x10
main+0x92 -> main+0xa2
main+0x3a -> main+0x52
main+0x52 -> main+0x6a

我可以將此值放入2D數組中嗎? 然后打印。 如果是,該怎么辦?

我想要這樣的輸出:

Array1[1]= main
Array2[1]=0x20 //in int
Array3[1]=main
Array4[1]=0x10 //in int

Array1[2]=Function1
Array2[2]=0 //in int
Array3[2]=Function2
Array4[2]=0x20 //in int

Array1[3]=Function2
Array2[3]=0x34 //int
Array3[3]=Function3
Array4[3]=0
//Continue until EOF

使用%s假定指向以null符號結尾的char數組的指針。 但是您給char而不是char的指針。

如果需要一個符號-應該使用%c

printf("%c", str1[0]);
for (int i=0; i<4; i++){
    printf("This is it!!! %c ", str1[i]);
}

如果您需要帶偏移量的字符串-您應該使用指針:

printf("%s", &str1[0]);
for (int i=0; i<4; i++){
    printf("This is it!!! %s ", &str1[i]);
}

請參閱printf參考

EDIT1:

解決了...

#include <stdio.h>
#define MAX_LINE_CNT 3
int main(int argc, char* argv[])
{
    char const* const fileName = argv[1];
    FILE* file = fopen(fileName, "r");
    char line[256];
    char i, cnt = 0;
    char str1[MAX_LINE_CNT][10], str3[MAX_LINE_CNT][10], * tmp;
    int arr2[MAX_LINE_CNT], arr4[MAX_LINE_CNT];
    while (fgets(line, sizeof(line), file)) {
        tmp = strstr(line," -> ");
        arr2[cnt] = 0; arr4[cnt] = 0;
        sscanf(line,"%[^+ ]%x%*s", str1[cnt],&arr2[cnt]);
        sscanf(tmp," -> %[^+ ]%x%*s", str3[cnt],&arr4[cnt]);
        //cnt++;
        if (++cnt >= MAX_LINE_CNT) break;
    }
    fclose(file);
    for (i = 0; i < cnt; i++) {
        printf("Array1[%d] %s \n", i+1, str1[i]);
        printf("Array2[%d] %x \n", i+1, arr2[i]);
        printf("Array3[%d] %s \n", i+1, str3[i]);
        printf("Array4[%d] %x \n", i+1, arr4[i]);
    }
    return 0;
}

EDIT2:

強烈建議您閱讀chux的答案和c / c ++參考,以了解您在做什么以及編譯后到底會發生什么。

每次我要打印它們時,都會遇到分割錯誤(請查看注釋的代碼)。 這是為什么?

A)代碼未使用保護。 請注意,將數據讀入str1 ,如果文本長度超過9,代碼將導致未定義行為(UB)作為str1[10] ,因為字符串最多只能容納9個字符和一個空字符。

B)代碼未檢查sscanf()的結果。 除非掃描了2個字段,否則printf("Thirs is : %s\\n", str3); 將導致UB,因為它可能會打印未初始化的字符數組。

// problematic code

// text input "function2+0x34 -> function3\n"
while (fgets(line, sizeof(line), file)) {  
  char str1[10], str3[10];
  sscanf(line,"%s -> %s", str1,str3);
  printf("First is: %s \n", str1);
  printf("Thirs is : %s\n", str3);

怎么修?

A)限制輸入到目標數組。 9是要讀取的最大字符寬度。

  sscanf(line,"%9s -> %9s", str1,str3);

B)檢查sscanf()結果

  if (sscanf(line,"%9s -> %9s", str1,str3) != 2) {
    fprintf(stderr, "Scan failure\n");
    return -1;
  }

C)注意數組str1[]和其他數組可能太小。 根據需要增加。

我可以將此值放入2D數組中嗎? 然后打印。 如果是,該怎么辦? 我想要類似...的輸出

代碼當然可以,但是這是另一個需要更詳細地了解OP目標的問題,實際上應該是OP首先嘗試的一個問題。

提示:查看sscanf()格式說明符"%[]""%n""%x"

如果仍然遇到問題,請使用一些未經測試的代碼來掃描str1[] ...

字符f [100]; 無符號地址
int cnt = sscanf(str1,“%99 [^ +] +%x”,f,&addr);
if(cnt == 1)puts(“僅找到第一個字段”);
否則,如果(cnt == 2)puts(“找到兩個字段”);
否則放置(“意外輸入”);

有許多功能可以檢查成功或失敗。
這將SIZE定義為4,但可以根據需要增加。
char str1[SIZE][40]最多允許4個字符串,每個字符串最多40個字符。
第一步是分離兩個初始子字符串。 使用掃描集, %39[^-]將最多掃描39個字符(防止在陣列存儲器中寫入太多字符)並捕獲所有非-字符。
strchr測試子字符串是否包含+並在適當時分析該子字符串。

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

//maximum lines to process
#define SIZE 4

int main(int argc, char* argv[])
{
    char line[256];
    char str1[SIZE][40], str3[SIZE][40];
    char sub1[40], sub3[40];
//        char sub1[SIZE], sub3[SIZE];   //mistake on this line
    int str2[SIZE], str4[SIZE];
    int each = 0;
    int result = 0;
    int loop = 0;
    FILE* file = NULL;

    //check for correct arguments
    if ( argc != 2) {
        printf ( "syntax is program filename\n");
        return 1;
    }

    //check for successful file opening
    if ( ( file = fopen(argv[1], "r")) == NULL) {
        printf ( "could not open file %s\n", argv[1]);
        return 2;
    }

    while (fgets(line, sizeof(line), file)) {//loop through the file one line at a time
        printf("The Full Line is: %s", line);
        //sscanf the two sub strings
        //sscanf returns number of items scanned so success will be 2
        if ( ( result = sscanf(line,"%39[^-] -> %39[^\n]", sub1,sub3)) == 2) {
            printf("First is: %s \n", sub1);
            printf("Thirs is : %s\n", sub3);
            //is there a + in the substring
            if ( ( strchr ( sub1, '+')) != NULL) {
                //get the two values
                if ( ( result = sscanf ( sub1, "%39[^+]+ 0x%x",str1[each], &str2[each])) != 2) {
                    printf ( "problem parsing sub1 + %s\n", sub1);
                    continue;
                }
            }
            else {// no +
                str2[each] = 0;
                //get the one value
                if ( ( result = sscanf ( sub1, "%39s",str1[each])) != 1) {
                    printf ( "problem parsing sub1 %s\n", sub1);
                    continue;
                }
            }
            //is there a + in the substring
            if ( ( strchr ( sub3, '+')) != NULL) {
            //if ( ( sub3[strcspn ( sub3, "+")]) < strlen ( sub3)) {
                //get the two values
                if ( ( result = sscanf ( sub3, "%39[^+]+ 0x%x",str3[each], &str4[each])) != 2) {
                    printf ( "problem parsing sub3 + %s\n", sub3);
                    continue;
                }
            }
            else {
                str4[each] = 0;
                //get the one value
                if ( ( result = sscanf ( sub3, "%39s",str3[each])) != 1) {
                    printf ( "problem parsing sub3 %s\n", sub3);
                    continue;
                }
            }
            each++;
            if ( each >= SIZE) {
//                if ( each > SIZE) {   //mistake on this line
                break;
            }
        }
        else {
            printf ( "trouble parsing %s\n", line);
        }

    }
    fclose(file);

    for ( loop = 0; loop < each; loop++) {
        printf("Array[%d]=%s\n", loop + 1, str1[loop]);
        printf("Array[%d]=0x%x\n", loop + 1, str2[loop]);
        printf("Array[%d]=%s\n", loop + 1, str3[loop]);
        printf("Array[%d]=0x%x\n\n", loop + 1, str4[loop]);
    }
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM